标签:
1.定义
Provide an interface for creating families of related or dependent objects without specifying their concrete classes.(为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。)
2.模式说明
抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。
3.通用代码
/// <summary> /// 抽象产品类 /// </summary> public abstract class AbstractProductA { //抽象方法 public abstract void Method1(); } /// <summary> /// 具体产品类 /// </summary> public class ProductA1 : AbstractProductA { public override void Method1() { //业务逻辑处理 Console.WriteLine("ProductA1"); } } /// <summary> /// 具体产品类 /// </summary> public class ProductA2 : AbstractProductA { public override void Method1() { //业务逻辑处理 Console.WriteLine("ProductA2"); } }
/// <summary> /// 抽象产品类 /// </summary> public abstract class AbstractProductB { //抽象方法 public abstract void Method1(); } /// <summary> /// 具体产品类 /// </summary> public class ProductB1 : AbstractProductB { public override void Method1() { //业务逻辑处理 Console.WriteLine("ProductB1"); } } /// <summary> /// 具体产品类 /// </summary> public class ProductB2 : AbstractProductB { public override void Method1() { //业务逻辑处理 Console.WriteLine("ProductB2"); } }
/// <summary> /// 抽象工厂类
/// 工厂类定义了两个产品族的产品创建, 有N个产品族,在抽象工厂类中就应该有N个创建方法。 /// </summary> public abstract class AbstractFactory {
//创建A产品族产品 public abstract AbstractProductA CreateProductA();
//创建B产品族产品 public abstract AbstractProductB CreateProductB(); } /// <summary> /// 具体工厂类,有M个产品等级就应该有M个实现工厂类,在每个实现工厂中,实现不同产品族的生产任务。 /// </summary> public class Creator1 : AbstractFactory { public override AbstractProductA CreateProductA() { return new ProductA1(); } public override AbstractProductB CreateProductB() { return new ProductB1(); } } /// <summary> /// 具体工厂类 /// </summary> public class Creator2 : AbstractFactory { public override AbstractProductA CreateProductA() { return new ProductA2(); } public override AbstractProductB CreateProductB() { return new ProductB2(); } }
/// <summary> /// 场景类 /// </summary> public class Client { public static void Main(string[] args) { AbstractFactory creator1 = new Creator1(); AbstractProductA a1 = creator1.CreateProductA(); AbstractProductB b1 = creator1.CreateProductB(); a1.Method1(); b1.Method1(); Console.ReadKey(); } }
4.模式的优缺点
(1)优点
.封装性:每个产品的实现类不是高层模块要关心的,它要关心的是什么?是接口,是抽象,它不关心对象是如何创建出来的,这由谁负责呢?工厂类,只要知道工厂类是谁,就能创建出一个需要的对象。
(2)缺点
抽象工厂模式的最大缺点就是产品族扩展非常困难,为什么这么说呢?以通用代码为例,如果要增加一个产品C,也就是说产品家族由原本的2个增加到3个,看看我们的程序有多少改动吧!抽象类AbstractFactory要增加一个方法CreateProductC(),然后两个实现类也都要修改,这严重违反了开闭原则。
参考
1.设计模式之禅
标签:
原文地址:http://www.cnblogs.com/JustYong/p/4612129.html