每年软考中对于设计模式的考查是不可缺少的,因此对于这部分知识的准备也是须要花费一些精力的。以下分享一点儿自己在设计模式过程中学习的经历。
工厂系列分享例如以下:
******************************************工厂的引入***************************************
工厂的引入:控制对象的创建过程。
事实上使用newkeyword就是为了创建一个对象的。那么既然有了newkeyword,为什么又要使用工厂来控制对象的创建过程呢?答案例如以下:
newkeyword是不管你是谁都能够用它来创建对象,不加不论什么限制。工厂则对其创建的过程加入了限制。比如你有一个抽屉。抽屉中装满了钱。
使用newkeyword,不论你是谁都能够得到抽屉的钥匙。可是使用工厂则不一样了,工厂须要推断你是否具有拿到该抽屉的钥匙的权利,如果你是我儿子,那么你就能够拿到这把钥匙了,如果你不是我儿子,那么你就无权得到这把钥匙了。当然你更不可能得到抽屉中的钱了。
说白了工厂就是通过自身来创建对象的。
理解了工厂,我们再逐个理解简单工厂。工厂方法。抽象工厂。
*************************************简单&&工厂*****************************************
简单工厂:“简单工厂”简单点儿说就是为了将对象的创建过程单独封装独立。
图一:简单工厂类图
图二:简单工厂的工厂类的代码
解析:简单工厂就是利用图二中的代码来封装对象的创建过程的。
在其工厂类中包括了必要的逻辑推断,因此能够依据client的选择条件动态地实例化相关的类,对于client来说,去除了与详细产品的依赖。
*************************************工厂&&方法******************************************
工厂方法:在“简单工厂”的基础上进一步抽象和推广。使用“多态”克服了“简单工厂”在工厂内部进行分支推断的缺点。
图一:工厂方法类图
图二:先构建一个工厂接口
图三:加减乘除各建一个详细工厂去实现图二中的工厂接口
图四:client代码
解析:
通过观察。非常easy发现工厂方法在简单工厂的基础上,将“简单工厂类”中的每个分支都单独分装成了一个独立的类。
这样就攻克了“简单工厂”在加入一个类似“求M数的N次方”的功能时须要改动原有的工厂类的问题了。
工厂方法模式实现时,client须要解决实例化哪一个工厂来实现运算类,选择推断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑推断移到了client代码来进行。你想要加功能,本来是改工厂类的,而如今是改动client。
**************************************抽象&&工厂******************************************
抽象工厂:在工厂方法的基础上。为了解决创建一系列产品的问题。
图一:抽象工厂模式结构图
解析:
单纯从结构图来观察“工厂方法”和“抽象工厂”,似乎认为他们是一样的。抽象工厂仅仅是在“工厂方法”的基础上多添加一个“产品B”。事实上细致想想当初的设计的机房收费系统中关于抽象工厂这一块,倘若我们不考虑移植性,我们是否也就能够使用“工厂方法”呢,而不是“抽象工厂”呢?当初之所以採用“抽象工厂”。是考虑到系列产品的移植等问题。比如插入数据时Access必需要Insertinto,而SQLServer能够不用into;SQL Server中的GetDate()在Access中没有,须要改成Now()。
SQL Server是自成一体系的,而Access中的东西又一个体系。所以假设要更换数据库的话,当然是依照系列来更换的。
这里我们还须要理解一个词“系列”:许很多多有关联的事物。一连串的事物。事实上这个词联系生活还是挺好理解的,比如海尔的系列产品(组合产品)。
还有一个词就是“产品品种”了:产品品种是相对于某一个系列产品的。
工厂方法与抽象工厂的差别:“工厂方法”是可以非常方便的加入一个产品品种(即一个功能)。可是须要加入一系列产品是则会造成工厂泛滥的问题。
可是对于“抽象工厂”而言。假设是要加入一个产品品种的话,则须要改动多个地方(AbstractFactory。ConcreteFactory 1,ConcreteFacotry 2)
*************************************总&&结****************************************
总结:设计模式之学习,路漫漫其修远兮,吾将上下而求索!望批评指正!
版权声明:本文博客原创文章,博客,未经同意,不得转载。
本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4639380.html,如需转载请自行联系原作者