三、设计模式之工厂模式--抽象工厂模式--创建型模式
抽象工厂模式:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
抽象工厂模式类图如下:

抽象工厂(Interface Creator/Factory)角色:担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关的。
具体工厂(Concrete Creator/Factory)角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。
抽象产品(Interface Product)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。
具体产品(Concrete Product)角色:这个角色用以代表具体的产品。
抽象工厂模式就相当于创建实例对象的new,由于经常要根据类生成实例对象,抽象工厂模式也是用来创建实例对象的,所以在需要新的事例对象时便可以考虑是否使用工厂模式。虽然这样做可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。
示例:
using System; namespace FactoryMethod { class Program { static void Main(string[] args) { //IFoodFactory beiFangfactory = new BeiFangZongZiFactory(); //IJiaoZi beifangjiaozi = beiFangfactory.CreateJiaoZi("芹菜"); //beifangjiaozi.Prepare(); //beifangjiaozi.Ok(); //IZongzi beifangzongzi = beiFangfactory.CreateZongZi("五香"); //beifangzongzi.Prepare(); //beifangzongzi.Ok(); IFoodFactory NanFangfactory = new NanFangZongZiFactory(); IJiaoZi beifangjiaozi = NanFangfactory.CreateJiaoZi("芹菜"); beifangjiaozi.Prepare(); beifangjiaozi.Ok(); IZongzi beifangzongzi = NanFangfactory.CreateZongZi("五香"); beifangzongzi.Prepare(); beifangzongzi.Ok(); Console.ReadKey(); } } /// <summary> /// 抽象产品 粽子 /// </summary> interface IZongzi { void Prepare(); void Ok(); } /// <summary> /// 抽象产品 饺子 /// </summary> interface IJiaoZi { void Prepare(); void Ok(); } /// <summary> /// 带皮的具体产品,饺子 /// </summary> public class NanFangJiaoZi : IJiaoZi { public NanFangJiaoZi(string name) { Name = name; } public string Name { get; private set; } public void Prepare() { Console.WriteLine("南方" + Name + "饺子,已经准备好。"); } public void Ok() { Console.WriteLine("南方" + Name + "饺子,可以开吃。"); } } /// <summary> /// 带皮的具体产品,饺子 /// </summary> public class BeiFangJiaoZi : IJiaoZi { public BeiFangJiaoZi(string name) { Name = name; } public string Name { get; private set; } public void Prepare() { Console.WriteLine("北方" + Name + "饺子,已经准备好。"); } public void Ok() { Console.WriteLine("北方" + Name + "饺子,可以开吃。"); } } /// <summary> /// 带皮的具体产品,粽子 /// </summary> public class NanFangZongZi : IZongzi { public NanFangZongZi(string name) { Name = name; } public string Name { get; private set; } public void Prepare() { Console.WriteLine("南方" + Name + "甜粽子,已经准备好。"); } public void Ok() { Console.WriteLine("南方" + Name + "甜粽子,可以开吃。"); } } /// <summary> /// 带皮的具体产品,粽子 /// </summary> public class BeiFangZongZi : IZongzi { public BeiFangZongZi(string name) { Name = name; } public string Name { get; private set; } public void Prepare() { Console.WriteLine("北方" + Name + "甜粽子,已经准备好。"); } public void Ok() { Console.WriteLine("北方" + Name + "甜粽子,可以开吃。"); } } /// <summary> /// 粽子工厂方法,抽象的 /// </summary> interface IFoodFactory { IZongzi CreateZongZi(string name); IJiaoZi CreateJiaoZi(string name); } /// <summary> /// 具体粽子工厂,北方粽子工厂 /// </summary> class BeiFangZongZiFactory : IFoodFactory { public IZongzi CreateZongZi(string name) { return new BeiFangZongZi(name); } public IJiaoZi CreateJiaoZi(string name) { return new BeiFangJiaoZi(name); } } /// <summary> /// 具体粽子工厂,南方粽子工厂 /// </summary> class NanFangZongZiFactory : IFoodFactory { public IZongzi CreateZongZi(string name) { return new NanFangZongZi(name); } public IJiaoZi CreateJiaoZi(string name) { return new NanFangJiaoZi(name); } } }
运行结果如下:

示例解析:
示例中IZongzi接口对应类图中的Interface ProductA或者Interface ProductB;对方的产品实现NanFangJiaoZi,BeiFangJiaoZ,NanFangZongZii,BeiFangZongZi分别是接口对应的实现。IFoodFactory对应抽象工厂类图中的Interface ICreator,BeiFangZongZiFactory和NanFangZongZiFactory对应类图中的concerteCreater,是抽象工厂类图的具体实现,在具体实现中创建对应的具体产品。
工厂模式优缺点:
优点:消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。
缺点:当具体产品修改时,相应的工厂类也要做相应的修改。
上面只是理论上的抽象工厂模式,在实际的项目中都使用抽象工厂和配置文件结合使用。

浙公网安备 33010602011771号