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


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


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

 

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


其实使用new关键字就是为了创建一个对象的,那么既然有了new关键字,为什么又要使用工厂来控制对象的创建过程呢?答案如下:


new关键字是无论你是谁都可以用它来创建对象,不加任何限制。工厂则对其创建的过程添加了限制。例如你有一个抽屉,抽屉中装满了钱。使用new关键字,不论你是谁都可以得到抽屉的钥匙;但是使用工厂则不一样了,工厂需要判断你是否具有拿到该抽屉的钥匙的权利,假设你是我儿子,那么你就可以拿到这把钥匙了,假设你不是我儿子,那么你就无权得到这把钥匙了,当然你更不可能得到抽屉中的钱了。


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

 

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

 

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


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

 

图一:简单工厂类图

软考之路(6)——设计模式之工厂系列_第1张图片

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


解析:简单工厂就是利用图二中的代码来封装对象的创建过程的。在其工厂类中包含了必要的逻辑判断,因此可以根据客户端的选择条件动态地实例化相关的类,对于客户端来说,去除了与具体产品的依赖。

 

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

 

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

 

图一:工厂方法类图


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

软考之路(6)——设计模式之工厂系列_第2张图片

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

软考之路(6)——设计模式之工厂系列_第3张图片

图四:客户端代码



解析:

通过观察,很容易发现工厂方法在简单工厂的基础上,将“简单工厂类”中的每一个分支都单独分装成了一个独立的类。这样就解决了“简单工厂”在添加一个类似“求M数的N次方”的功能时需要修改原有的工厂类的问题了。


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

 

 

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


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

 

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

软考之路(6)——设计模式之工厂系列_第4张图片

解析:


单纯从结构图来观察“工厂方法”和“抽象工厂”,似乎觉得他们是一样的。抽象工厂只是在“工厂方法”的基础上多增加一个“产品B”。其实仔细想想当初的设计的机房收费系统中关于抽象工厂这一块,倘若我们不考虑移植性,我们是否也就可以使用“工厂方法”呢,而不是“抽象工厂”呢?当初之所以采用“抽象工厂”,是考虑到系列产品的移植等问题。例如插入数据时Access必须要Insert into,SQLServer可以不用intoSQL Server中的GetDate()在Access中没有,需要改成Now()SQL Server是自成一体系的,而Access中的东西又一个体系。所以如果要更换数据库的话,当然是按照系列来更换的。

 

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

 

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

 

工厂方法与抽象工厂的区别:“工厂方法”是能够很方便的添加一个产品品种(即一个功能),但是需要添加一系列产品是则会造成工厂泛滥的问题。但是对于“抽象工厂”而言,如果是要添加一个产品品种的话,则需要修改多个地方(AbstractFactoryConcreteFactory 1ConcreteFacotry 2


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


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


你可能感兴趣的:(软考之路(6)——设计模式之工厂系列)