3.抽象工厂模式

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.设计模式之禅

2.Terrylee 抽象工厂模式

原文地址:https://www.cnblogs.com/JustYong/p/4612129.html