zoukankan      html  css  js  c++  java
  • 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 抽象工厂模式

  • 相关阅读:
    Linux(Contos7.5)环境搭建之JDK1.8安装(二)
    python微信域名或者链接批量检测
    表单设计器3-查询面板
    表单设计器2-表格布局
    表单设计器1-基本操作
    信息无障碍国内标准
    信息无障碍国际标准
    信息无障碍服务对象
    信息无障碍定义
    E8.Net工作流开发问题
  • 原文地址:https://www.cnblogs.com/JustYong/p/4612129.html
Copyright © 2011-2022 走看看