zoukankan      html  css  js  c++  java
  • 设计模式(三):抽象工厂

    一、定义

    前面讲到的工厂方法。每个工厂对应着一类产品。抽象工厂就是工厂方法中不再是针对一种产品,而是多个不同类型的产品。

    工厂方法和抽象方法的区别—手工的图,字有点丑。

    二、实例

    服务类型接口:也可以比作"系列A",具体的产品:WCF、BL

     public interface IService
        {
        }
    
        public class WCF : IService
        {
            public WCF()
            {
                Console.WriteLine("WCF服务.");
            }
        }
    
        public class BL : IService
        {
            public BL()
            {
                Console.WriteLine("BL服务.");
            }
        }

    推送服务接口:也可比作"系列B":有QQ和Email产品

     public interface IPush
        {
        }
    
        public class QQ : IPush
        {
            public QQ()
            {
                Console.WriteLine("QQ推送服务.");
            }
        }
    
        public class Email : IPush
        {
            public Email()
            {
                Console.WriteLine("Email推送服务.");
            }
        }

    工厂接口:创建两种系列的产品:系列A和系列B

     public abstract class FactoryBuilder
        {
            public abstract IService CreatService();
            public abstract IPush CreatPush();
        }

    工厂A:创建WCF服务和QQ推送

     public class WCF_QQPushFactory : FactoryBuilder
        {       
            public override IService CreatService()
            {
                return new WCF();
            }
            public override IPush CreatPush()
            {
                return new QQ();
            }
    
        }

    工厂B:创建BL服务和Email推送

     public class BL_EmailFactory : FactoryBuilder
        {             
            public override IService CreatService()
            {
                return new BL();
            }
            public override IPush CreatPush()
            {
                return new Email();
            }
        }

    客户端调用:

     //抽象工厂
    Factory3.FactoryBuilder fb3 = new Factory3.WCF_QQPushFactory();
    fb3.CreatService();
    fb3.CreatPush();

    三、优缺点

    优:每个工厂可以创建不同系列 的不同产品。依然将实例化推迟到了子类。

    缺:如果某个系列要增加产品或者增加一种系列,那~~添加、修改的地方比较多。

    设计模式要辩证使用,合适的才是最好的。

  • 相关阅读:
    手写vite
    单点登录的实现原理
    vue中和react中key的用法
    手写MVVM
    rtvue-lowcode:一款基于uniapp框架和uview组件库的开源低代码开发平台
    博图TIA中ModbusRTU_CRC校验程序的实现
    博图TIA中ModbusRTU Over TCP/IP通讯的实现
    webpack之file-loader和url-loader的区别
    Webpack中Loader和Plugin的区别?编写Loader,Plugin的思路?
    spark-sql 与hive 常用函数
  • 原文地址:https://www.cnblogs.com/sunchong/p/5103370.html
Copyright © 2011-2022 走看看