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