设计形式记录(2.1)
设计模式记录(2.1)第十二章 简单工厂模式首先给出简单工厂模式的一个示意图:简单工厂模式就是由一个工厂类
设计模式记录(2.1)
第十二章 简单工厂模式首先给出简单工厂模式的一个示意图:
简单工厂模式就是由一个工厂类根据传入的参量决定创建出哪一种产品类的实例。
对于多层次的产品结构如下:
图中从Factory类到各个Product类的虚线代表创建(依赖)关系;从Client到其他类的连线是一般依赖关系。
这样做的好处是设计简单,产品类的等级结构不会反映到工厂类中来,从而产品类的等级结构的变化也就不会影响到工厂类。但是这样做的缺点是,增加新的产品必将导致工厂类的修改。
使用java接口或者java抽象类
如果模式所产生的具体产品类彼此之间没有共同的商业逻辑,那么抽象产品角色可以由一个java接口扮演,相反,如果这些具体产品类彼此之间确实有共同的商业逻辑,那么这些共有的逻辑就应该移到抽象角色里面,这就意味着抽象角色应当由一个抽象类扮演。在一个类型的等级结构里面,共同的代码应当尽量向上移动,已达到共享的目的。
简单工厂模式的缺点
当产品类有不同的接口种类时,工厂类需要判断在什么时候创建某种产品。这种对时机的判断和对哪一种具体产品的判断逻辑混合在一起,使得系统在将来进行功能扩展时较为困难。这一缺点在工厂方法模式中得到克服
开闭原则
在这个系统中,功能的扩展体现在引进新的产品上。开闭原则要求系统允许当新的产品加入系统中时,而无需对现有代码进行修改。这一点对于产品的消费角色是成立的,而对于工厂角色是不成立的。。(在增加一个产品类的时候,需要修改工厂类,这不符合开闭原则)
简单工厂代码:
产品:水果,葡萄,草莓,苹果。
水果接口:
源码将在最后给出。
工厂方法模式和简单工厂模式
工厂方法模式和简单工厂模式在结构上的不同时很明显的。工厂方法模式的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。
与简单工厂模式中的情形一样的是,ConcreteCreator的Factory方法返还的数据类型是一个抽象类型Product,而不是哪一个具体的产品类型,而客户端也不必知道所得到的产品的真实类型。这种多态性设计将工厂类选择哪一个产品对象、如何创建这个对象的细节完全封装在具体工厂类内部。
工厂方法模式之所以有一个别名叫做多态性工厂模式,显然是因为具体工厂类都有一个共同的接口,或者都有共同的抽象父类。
如果系统需要加入一个新的产品,那么所需要的就是向系统中加入一个这个产品类以及它所对应的工厂类。没有必要修改客户端,也没有必要修改抽象工厂角色或者其他已有的具体工厂角色。对于增加新的产品类而言,这个系统完全支持开闭原则。
下面是一个工厂方法在农场系统中的实现图:
java语言中工厂方法模式的例子
URL与URLConnection的应用:
左边的等级结构代表工厂等级结构,右边的两个等级结构分别代表两个不同的产品的等级结构。
在什么情况下应当使用抽象的工厂模式
1.一个系统不应该依赖与产品类实例如何被创建,组合和表达的细节,这对于所有形态的工厂模式都是重要的。
2.这个系统的产品有多于一个的产品族,而系统只消费其中某一族的产品
3.同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。
4.系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。
增加新的产品等级结构
在产品族的数目不变的情况下,增加新的产品等级结构。换言之,所有的产品等级结构中的产品数目不会改变,但是现在多出一个与现有的产品等级结构平行的新的产品等级结构。
要做到这一点,就需要修改所有的工厂角色,给每一个工厂类都增加一个新的工厂方法,而这显然是违背开闭原则的。换言之,对于产品等级结构的增加,抽象工厂模式是不支持开闭原则的。
综合起来,抽象工厂模式以一种倾斜的方式支持增加新的产品,它为新产品族的增加提供方便,而不能为新的产品等级结构的增加提供这样的方便。
抽象工厂模式在农场系统中的实现
蔬菜总接口:
个人理解抽象工厂模式就是对于多个产品族的。这多个产品族的结构相同,生产者的等级结构的每一部分对应生产产品族的一个部分。