zoukankan      html  css  js  c++  java
  • 软考路(6)——工厂设计模式系列


    每年软考中对于设计模式的考查是不可缺少的,因此对于这部分知识的准备也是须要花费一些精力的。以下分享一点儿自己在设计模式过程中学习的经历。

    工厂系列分享例如以下:


    ******************************************工厂的引入***************************************

     

    工厂的引入:控制对象的创建过程。


    事实上使用newkeyword就是为了创建一个对象的。那么既然有了newkeyword,为什么又要使用工厂来控制对象的创建过程呢?答案例如以下:


    newkeyword是不管你是谁都能够用它来创建对象,不加不论什么限制。工厂则对其创建的过程加入了限制。比如你有一个抽屉。抽屉中装满了钱。

    使用newkeyword,不论你是谁都能够得到抽屉的钥匙。可是使用工厂则不一样了,工厂须要推断你是否具有拿到该抽屉的钥匙的权利,如果你是我儿子,那么你就能够拿到这把钥匙了,如果你不是我儿子,那么你就无权得到这把钥匙了。当然你更不可能得到抽屉中的钱了。


    说白了工厂就是通过自身来创建对象的。

     

    理解了工厂,我们再逐个理解简单工厂。工厂方法。抽象工厂。

     

    *************************************简单&&工厂*****************************************


    简单工厂:“简单工厂”简单点儿说就是为了将对象的创建过程单独封装独立。

     

    图一:简单工厂类图


    图二:简单工厂的工厂类的代码


    解析:简单工厂就是利用图二中的代码来封装对象的创建过程的。

    在其工厂类中包括了必要的逻辑推断,因此能够依据client的选择条件动态地实例化相关的类,对于client来说,去除了与详细产品的依赖。

     

    *************************************工厂&&方法******************************************

     

    工厂方法:在“简单工厂”的基础上进一步抽象和推广。使用“多态”克服了“简单工厂”在工厂内部进行分支推断的缺点。

     

    图一:工厂方法类图


    图二:先构建一个工厂接口


    图三:加减乘除各建一个详细工厂去实现图二中的工厂接口


    图四:client代码



    解析:

    通过观察。非常easy发现工厂方法在简单工厂的基础上,将“简单工厂类”中的每个分支都单独分装成了一个独立的类。

    这样就攻克了“简单工厂”在加入一个类似“求M数的N次方”的功能时须要改动原有的工厂类的问题了。


    工厂方法模式实现时,client须要解决实例化哪一个工厂来实现运算类,选择推断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑推断移到了client代码来进行。你想要加功能,本来是改工厂类的,而如今是改动client。

     

     

    **************************************抽象&&工厂******************************************


    抽象工厂:在工厂方法的基础上。为了解决创建一系列产品的问题。

     

    图一:抽象工厂模式结构图


    解析:


    单纯从结构图来观察“工厂方法”和“抽象工厂”,似乎认为他们是一样的。抽象工厂仅仅是在“工厂方法”的基础上多添加一个“产品B”。事实上细致想想当初的设计的机房收费系统中关于抽象工厂这一块,倘若我们不考虑移植性,我们是否也就能够使用“工厂方法”呢,而不是“抽象工厂”呢?当初之所以採用“抽象工厂”。是考虑到系列产品的移植等问题。比如插入数据时Access必需要Insert into,SQLServer能够不用intoSQL Server中的GetDate()在Access中没有,须要改成Now()

    SQL Server是自成一体系的,而Access中的东西又一个体系。所以假设要更换数据库的话,当然是依照系列来更换的。

     

    这里我们还须要理解一个词“系列”:许很多多有关联的事物。一连串的事物。事实上这个词联系生活还是挺好理解的,比如海尔的系列产品(组合产品)。

     

    还有一个词就是“产品品种”了产品品种是相对于某一个系列产品的。

     

    工厂方法与抽象工厂的差别:“工厂方法”是可以非常方便的加入一个产品品种(即一个功能)。可是须要加入一系列产品是则会造成工厂泛滥的问题。

    可是对于“抽象工厂”而言。假设是要加入一个产品品种的话,则须要改动多个地方(AbstractFactoryConcreteFactory 1ConcreteFacotry 2


    *************************************&&****************************************


    总结:设计模式之学习,路漫漫其修远兮,吾将上下而求索!望批评指正!


    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    cf C. Vasya and Robot
    zoj 3805 Machine
    cf B. Vasya and Public Transport
    cf D. Queue
    cf C. Find Maximum
    cf B. Two Heaps
    cf C. Jeff and Rounding
    cf B. Jeff and Periods
    cf A. Jeff and Digits
    I Think I Need a Houseboat
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4639380.html
Copyright © 2011-2022 走看看