• 抽象工厂模式


    所谓抽象工厂,就是在工厂模式的基础上,将工厂也抽象出来,工厂模式是在工厂类中返回指定的具体类,而抽象工厂正是具有全部的工厂类,返回指定的工厂类

    抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建

    其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

    Abstract Factory注意的几点:
        如果不存在”多系列对象创建“的需求变化,则没必要应用Abstract Factory模式,静态工厂方法足矣。
        "系列对象"指的是这些对象之间有相互依赖、或作用的关系。例如游戏开发场景中的"道路"与"房屋"依赖,“道路”与“地道”的依赖。
    Abstract Factory模式主要在于应对"新系列"的需求变动。其缺点在于难以应对”新对象“的需求变动。
    Abstract Factory模式经常和Factory Method模式共同组合来应对“对象创建”的需求变化。

    下方简单实现抽象模式的思想,结合策略模式,书写以下示例代码:

      #region 工厂类
        class Factory1
        {
            /*
             public Road CreateRoad()
             {
                  return new Road();
             }
             */
            //...
        }
        class Factory2
        {
            /*
           public Load CreateLoad()
           {
                return new Load();
           }
           */
            //...
        }
        #endregion
      #region 抽象工厂
        abstract class AbstractFactory
        {
            protected Hashtable hash = new Hashtable();
            protected Center _center;
            public abstract object GetInstance(string name, Center center);
    
        }
        #endregion
      #region 抽象工厂实现类
        class ConcreteFactory: AbstractFactory
        {
            public override object GetInstance(string name, Center center)
            {
                _center = center;
                if (hash[name] == null)
                {
                    center.getFactory(hash, name);
                }
                return hash[name];
            }
        }
        #endregion
     #region 策略模式的中间类
         interface Center
        {
            void getFactory(Hashtable hash, string name);
        }
        class Center1: Center
        {
            public void getFactory(Hashtable hash,string name)
            {
                if(name=="1")
                {
                    hash[name] = new Factory1();
                }
                else if(name == "2")
                {
                    hash[name] = new Factory2();
                }
            }
        }
        #endregion
      static void Main(string[] args)
            {
                AbstractFactory abstractfactory = new ConcreteFactory();
                Factory1 f1=(Factory1)abstractfactory.GetInstance("1",new Center1());//这样创建出来的就是借助Center1通过抽象工厂创建出来的Factory1
                Console.ReadKey();
            }

    之所以使用策略模式,是考虑以后的扩展性,以后工厂模式如果不止2个的话,那么我在创建的时候输入的字符串也不同,那么我就需要修改抽象工厂子类中的GetInstance代码,无法完成封装,我使用策略模式,将无法封装的替换为中介类来实现,这样以后变化了我只需要修改该中间类,或者直接新增一个中间类(主要是为了这个),无需任何修改。

  • 相关阅读:
    mysql索引之主键索引
    mysql优化(一)
    mysql锁机制(七)
    dns之缓存。
    http之http1.0和http1.1的区别
    http之post和get请求的区别
    https
    vim、gvim加载文件慢
    加载virtual box共享文件加载
    深入理解SELinux SEAndroid
  • 原文地址:https://www.cnblogs.com/ningxinjie/p/12220874.html
Copyright © 2020-2023  润新知