zoukankan      html  css  js  c++  java
  • 设计模式 3/23 抽象工厂模式

    我看了很多的帖子,设计模式几乎是园子里的月经贴,每隔一段时间总有人来分享一下自己的学习心得,或为记录自己所学,或为换着方式分享与大家。但大多直接上来就是给代码,给UML图,给类图,其实这种是快,但很多工作经验少的同学,几乎无法体会其中的所含的内容,更无法在日常工作中运用所学,提升系统框架,功能的设计开发能力。

    我希望能通过足够简单的文字,让大家去体会到前人们所总结出来的设计模式

    世间本无设计模式,用的人多了,自然就有了

    前面两张根据渐进明细的原则,逐步的从简单工厂模式走到工厂模式,今天介绍工厂的终极形态,抽象工厂

    不要被终极形态所迷惑,我只是为了增加层层递进的效果

    抽象工厂模式(Abstract Factory Pattern),提供一个创建一系列相关或相互依赖的接口,而无需指定它们具体的类

    我就问还有谁,还有谁能第一眼看明白,理解透彻,知道是什么意思,站出来,算你输

    老规矩,看黑板,画重点

    2个点

    1.抽象,工厂, 这是一个动宾结果,抽象是动词,干嘛呢,抽象->工厂,对工厂进行抽象,我们对类进行抽象可以得到抽象类,抽象类什么概念??

    看上去不同,但是本质上相同的具体概念的抽象,我们称为抽象类

    你可以认为抽象类是一个超级基类

    那同理

    抽象工厂,我们用形容词+名词结构来解释,抽象的工厂,那就是一个超级工厂。

    超级工厂就是其他工厂的工厂,围绕超级工厂创建其他工厂

    2.无需制定它们具体的类

    我们的工厂负责生产具体的东西,不需要显示的告诉他们,你需要生产什么什么,你只需要按照我们超级工厂告诉你的做法去做,你生产出来的东西,就是我们要的东西

    我们要的东西,超级工厂里已经告诉你了,等下请细细品味超级工厂,慢慢的体会这句话 

    我们举个例子

    Iphone,现在这个星球上人人都不陌生的手机,那Iphone其实还分32G 啦,64G啦等等型号的

    在这个星球上,富士康是总所周知的苹果生产主力厂商,注意,是主力,不是全部

    我们假设,富士康的竞争对手比亚迪,也能生产Iphone

    那苹果公司就会想了,我得分散,我不能全部交给富士康去生产,如果富士康要提价,我还没有其他选择么,我可以选择比亚迪来制衡富士康

    基于这样一个案例,我们看看怎么用抽象工厂模式来实现

    我们有IPhone,并且有各种不同型号的IPhone

         /// <summary>
        /// 我是IPhone 抽象类
        /// </summary>
        public abstract class IPhone
        {
            /// <summary>
            /// 生产厂商名称
            /// </summary>
            public abstract string FactoryName { get; set; }
    
            /// <summary>
            /// 手机的说明书
            /// </summary>
            public abstract void Instructions();
        }
    
         /// <summary>
        /// 64G的 IPhone
        /// </summary>
        public class IPhone64G : IPhone
        {
            public override string FactoryName { get; set; }
            public override void Instructions()
            {
                Console.WriteLine("我是64G的IPhone,我被" + FactoryName + "制造出来了");
            }
        }
    
    
        /// <summary>
        /// 32G的 IPhone
        /// </summary>
        public class IPhone32G : IPhone
        {
            public override string FactoryName { get; set; }
            public override void Instructions()
            {
                Console.WriteLine("我是32G的IPhone,我被" + FactoryName + "制造出来了");
            }
        }
    View Code

    然后我们来创建一个超级工厂

        /// <summary>
        /// 超级工厂
        /// </summary>
        public interface IFactory
        {
            /// <summary>
            /// 请生产64位IPhone
            /// </summary>
            /// <returns></returns>
            IPhone64G CreatePhone64G();
    
            /// <summary>
            /// 请生产32位IPhone
            /// </summary>
            /// <returns></returns>
            IPhone32G CreatePhone32G();
        }
    View Code

    然后我们分别创建富士康和比亚迪

    富士康

        /// <summary>
        /// 富士康
        /// </summary>
        public class FoxconnFactory : IFactory
        {
            private string FactoryName = "Foxconn";
    
            /// <summary>
            /// 生产64位IPhone
            /// </summary>
            /// <returns></returns>
            public IPhone64G CreatePhone64G()
            {
                var iphone64G = new IPhone64G()
                {
                    FactoryName = FactoryName
                };
                return iphone64G;
            }
    
            /// <summary>
            /// 生产32位IPhone
            /// </summary>
            /// <returns></returns>
            public IPhone32G CreatePhone32G()
            {
                var iphone32G = new IPhone32G()
                {
                    FactoryName = FactoryName
                };
                return iphone32G;
            }
        }
    View Code

    比亚迪

        /// <summary>
        /// 比亚迪
        /// </summary>
        public class BydFactory : IFactory
        {
            private string FactoryName = "BYD";
    
            /// <summary>
            /// 生产64位IPhone
            /// </summary>
            /// <returns></returns>
            public IPhone64G CreatePhone64G()
            {
                var iphone64G = new IPhone64G()
                   {
                       FactoryName = FactoryName
                   };
                return iphone64G;
            }
    
            /// <summary>
            ///  生产32位IPhone
            /// </summary>
            /// <returns></returns>
            public IPhone32G CreatePhone32G()
            {
                var iphone32G = new IPhone32G()
                {
                    FactoryName = FactoryName
                };
                return iphone32G;
            }
        }
    View Code

    以上,我们的抽象工厂模式就完成了,我们来看看怎么调用

      static void Main()
            {
                IFactory factory = new FoxconnFactory();
                var iphone64G = factory.CreatePhone64G();
                iphone64G.Instructions();
                var iphone32G = factory.CreatePhone32G();
                iphone32G.Instructions();
    
                IFactory factory2 = new BydFactory();
                var iphone64G2 = factory2.CreatePhone64G();
                iphone64G2.Instructions();
                var iphone32G2 = factory2.CreatePhone32G();
                iphone32G2.Instructions();
                Console.ReadLine();
            }
    View Code

    结果如下

    总结下

    优点

    1.我们有超级工厂,我们隔离了具体类的生产

    2.既然有1,那我们就容易改变产品的系列,后续要增加IPhone128G, IPhone7,8,9就很容易

    缺点

    增加产品的时候虽然说我们很容易,但是别忘记了,我们需要修改超级工厂的定义,同时还要在具体的工厂里面加代码

    不要沉迷与怎么把代码修改为抽象工厂模式,理解其为什么,是什么,最后去想怎么用

    以上就是关于抽象工厂设计模式的分享

  • 相关阅读:
    如何在Mac下配置多个Java版本
    robotframework-SikuliLibrary 第三方库
    点击按钮,按钮没有悬浮效果,不能拖拽元素。
    robot framework ——关键字run keyword if 如何在一个条件下接多个执行语句
    iOS测试中发现一个textview控制,使用clear()无法清除文字
    AppiumLibrary 关键字文档
    "startIWDP": true
    Proxifier ,CCProxy 新发现的东西。
    第一次Git上传本地项目到github上 的命令
    c#之数组
  • 原文地址:https://www.cnblogs.com/LionelMessi/p/7482598.html
Copyright © 2011-2022 走看看