且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

软考路(6)——工厂设计模式系列

更新时间:2022-08-17 17:47:23


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

工厂系列分享例如以下:


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

 

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


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


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

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


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

 

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

 

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


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

 

图一:简单工厂类图

软考路(6)——工厂设计模式系列

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

软考路(6)——工厂设计模式系列

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

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

 

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

 

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

 

图一:工厂方法类图

软考路(6)——工厂设计模式系列

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

软考路(6)——工厂设计模式系列

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

软考路(6)——工厂设计模式系列

图四:client代码

软考路(6)——工厂设计模式系列


解析:

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

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


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

 

 

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


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

 

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

软考路(6)——工厂设计模式系列

解析:


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

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

 

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

 

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

 

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

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


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


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


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





本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4639380.html,如需转载请自行联系原作者