为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

抽象工厂模式

2017-08-31 10页 doc 75KB 14阅读

用户头像

is_769254

暂无简介

举报
抽象工厂模式抽象工厂模式 Net设计模式实例之抽象工厂模式(Abstract Factory Pattern) 一、抽象工厂模式简介(Bref Introduction) 抽象工厂模式(Abstract Factory Pattern),提供一个创建一系列相关或者相互依赖对象的 接口,而无需制定他们的具体类。优点是:易于交换产品系列,由于具体工厂类在一个应 该用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂类变得非常容 易,它只需要改变具体工厂即可使用不同的产品配置。抽象工厂的另一个优点是,它让具 体的创建实例与客户端...
抽象工厂模式
抽象工厂模式 Net设计模式实例之抽象工厂模式(Abstract Factory Pattern) 一、抽象工厂模式简介(Bref Introduction) 抽象工厂模式(Abstract Factory Pattern),提供一个创建一系列相关或者相互依赖对象的 接口,而无需制定他们的具体类。优点是:易于交换产品系列,由于具体工厂类在一个应 该用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂类变得非常容 易,它只需要改变具体工厂即可使用不同的产品配置。抽象工厂的另一个优点是,它让具 体的创建实例与客户端分离,客户端是通过他们的抽象接口操纵实例,产品的具体类名也 被具体工厂的实现分离,不会出现在客户的代码中。 二、解决的问(What To Solve) 常用用于解决数据访问程序,也就是说程序通过使用抽象工厂模式后,可以灵活地在 不同的数据库之间切换,而不需要费时费力地改变原有程序。 三、抽象工厂模式分析(Analysis) 1、抽象工厂模式结构 IProductA、IProductA接口:两个产品接口,他们都有可能有两种不同的实现。 ProductA1、ProductA2,ProductB1、ProductB2具体实现类:对两个产品接口的具体分类的实现。 AbstractFactory抽象类:抽象工厂接口,它里面应该包含所有产品创建的抽象方法。 ConcreteFactory1、ConcreteFactory2具体工厂类:创建具有特定实现的产品对象 2、源代码 1、产品接口IProductA、IProductB及其两种实现 public interface IProductA { void Show(); } public class ProductA1 : IProductA { public void Show() { Console.WriteLine("具体产品类{0}展示方法。",this.GetType().Name); } } public class ProductA2 : IProductA { public void Show() { Console.WriteLine("具体产品类{0}展示方法。", this.GetType().Name); } } public interface IProductB { void Insert(); } public class ProductB1 : IProductB { public void Insert() { Console.WriteLine("具体产品类{0}插入方法。", this.GetType().Name); } } public class ProductB2 : IProductB { public void Insert() { Console.WriteLine("具体产品类{0}插入方法。", this.GetType().Name); } } 2、抽象工厂接口AbstractFactory,及其具体的工厂AbstractFactory1、AbstractFactory2 public abstract class AbstractFactory { public abstract IProductA CreateProductA(); public abstract IProductB CreateProductB(); } public class AbstractFactory1:AbstractFactory { public override IProductA CreateProductA() { IProductA productA1 = new ProductA1(); return productA1; } public override IProductB CreateProductB() { IProductB productB1 = new ProductB1(); return productB1; } } public class AbstractFactory2 : AbstractFactory { public override IProductA CreateProductA() { IProductA productA2 = new ProductA2(); return productA2; } public override IProductB CreateProductB() { IProductB productB2 = new ProductB2(); return productB2; } } 3、客户端代码 static void Main(string[] args) { //根据需求调用具体工厂AbstractFactory1 AbstractFactory factory1 = new AbstractFactory1(); IProductA productA1 = factory1.CreateProductA(); IProductB productB1 = factory1.CreateProductB(); productA1.Show(); productB1.Insert(); Console.WriteLine("\n"); //根据需求调用具体工厂AbstractFactory2 AbstractFactory factory2 = new AbstractFactory2(); IProductA productA2 = factory2.CreateProductA(); IProductB productB2 = factory2.CreateProductB(); productA2.Show(); productB2.Insert(); Console.ReadKey(); } 3、程序运行结果 四(案例分析(Example) 1、场景 使用抽象工厂+反射+配置文件实现数据访问层程序。结构如下图所示 用反射+抽象工厂+配置文件的数据访问程序。 Assembly.Load("程序集名称").CreateInstance("命名空间.类名称")。比如: IProduct product=(IProduct)Assembly.Load("抽象模式").CreateInstance("抽象工程模式.SqlServerProduct")。 常用做法是: Private static readonly string AssemblyName="抽象工程模式"; Private static readonly string DB=ConfiurationManager.AppSettings["db"]; 配置文件如下: 通过读配置文件给DB字符赋值,在配置文件中写明当前使用的是SqlServer 还是Access数据 库。反射+抽象工厂+配置文件解决解决了数据访问时的可维护、可扩展问题 2、代码 1、对象Uer、Product及其相对应的操作 public interface IUser { void Insert(); } public class SqlServerUser:IUser { public void Insert() { Console.WriteLine("{0}插入用户.",this.GetType().Name); } } public class AccessUser : IUser { public void Insert() { Console.WriteLine("{0}插入用户.", this.GetType().Name); } } public interface IProduct { void GetProduct(); } public class SqlServerProduct : IProduct { public void GetProduct() { Console.WriteLine("{0}查询商品.", this.GetType().Name); } } public class AccessProduct : IProduct { public void GetProduct() { Console.WriteLine("{0}查询商品.", this.GetType().Name); } } 2、数据访问类DataAccess public class DataAccess { private static readonly string AssemblyName = "AbstractFactoryReflection"; private static readonly string db = "SqlServer"; public static IUser CreateUser() { string className = AssemblyName + "." + db + "User"; IUser user = (IUser)Assembly.Load(AssemblyName).CreateInstance(className); return user; } public static IProduct CreateProduct() { string className = AssemblyName + "." + db + "Product"; return (IProduct)Assembly.Load(AssemblyName).CreateInstance(className); } } 3、客户端代码 static void Main(string[] args) { IUser user = DataAccess.CreateUser(); user.Insert(); IProduct product = DataAccess.CreateProduct(); product.GetProduct(); Console.ReadKey(); } 五、总结(Summary) 抽象工厂模式(Abstract Factory Pattern),提供一个创建一系列相关或者相互依赖对象的接口,而无需制定他们的具体类。抽象工厂模式的典型应用就是,使用抽象工厂+反射+配置文件实现数据访问层程序。
/
本文档为【抽象工厂模式】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索