学习设计模式,个人认为需要学习其精髓,虽然一时半会可能记不住,在进行软件开发的时候也想不起来,套用不了。这都无所谓,当掌握其精髓之后,遇到问题,看看示例代码便可以进行运用了。
大师说:"没有不变的需求,世上的软件都改动过3次以上,唯一一个只改动过两次的软件的拥有者已经死了,死在去修改需求的路上。"
这个可以当成笑话来看,同时它也是软件开发的至理名言,个人很喜欢这句话。
抛开需求谈模式,是不切实际的。没有万灵丹式的模式,每个模式适用于特别的场合。而封装变化,就是模式的精髓。 封装变化点与解耦有紧密的联系。
ABSTRACT FACTORY(抽象工厂)—对象创建型模式
1. 意 图
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类
解读:1、一系列即为此模式的精髓,也即变化点之一。当出现“多系列对象创建”的需求变化时适用此模式,否则没有必要使用Abstract Factory模式。
2、相关以及相互依赖,引出了产品族的概念,指位于不同产品等级结构中,功能相关联的产品组成的家族。
为了引出封装和变化与抽象工厂的真正精髓,这里先提一下工厂方法模式,因为本身抽象工厂也是与工厂方法结合使用的。试想一个问题,如果我要创建一个动物的对象,比如小狗好了。Dog,假如我的软件需要大量的生成Dog,那么就会在多个地方出现类似下面的情况。
Dog dd1 =new Dog ();
==============================华丽的分割线
Dog dd2 =new Dog ();
==============================华丽的分割线
Dog ddn =new Dog ();
==============================华丽的分割线
假设有一天小狗和小猫不合:需要把狗,改成Cat,如果只有三处,好吧,我忍,改了。如果这个n很大,是不是要改两天?且容易遗漏或者出错。也就是“精髓”出现了,生成的对象与代码紧密的耦合在一起了。需要解耦,我们要创建对象,而具体要创建的对象在变化。在这里产生了变化点。按封装变化的设计原则:这个生成对象的地方需要封装。我们由统一的方法产生。因此产生了工厂方法模式。如果创建工厂的这个Factory在实际需求中,也会不断的变,怎么办?老办法,封装变化。于是有了抽象工厂模式。
2. 适用性
在以下情况可以使用Abstract Factory模式
• 一个系统要独立于它的产品的创建、组合和表示时。
• 一个系统要由多个产品系列中的一个来配置时。
• 当你要强调一系列相关的产品对象的设计以便进行联合使用时。
• 当你提供一个产品类库,而只想显示它们的接口而不是实现时。
3.结构
4.参与者
• A b s t r a c t F a c t o r y
— 声明一个创建抽象产品对象的操作接口。
• C o n c r e t e F a c t o r y
— 实现创建具体产品对象的操作。
• A b s t r a c t P r o d u c t
— 为一类产品对象声明一个接口。
• C o n c r e t e P r o d u c t
— 定义一个将被相应的具体工厂创建的产品对象。
— 实现A b s t r a c t P r o d u c t接口。
• C l i e n t
— 仅使用由A b s t r a c t F a c t o r y和A b s t r a c t P r o d u c t类声明的接口。
5.效 果
A b s t r a c t F a c t o r y模式有下面的一些优点和缺点:
1) 它分离了具体的类 Abstract Factory模式帮助你控制一个应用创建的对象的类。因为一个工厂封装创建产品对象的责任和过程,它将客户与类的实现分离。客户通过它们的抽象接口操纵实例。产品的类名也在具体工厂的实现中被分离;它们不出现在客户代码中。
2) 它使得易于交换产品系列 一个具体工厂类在一个应用中仅出现一次—即在它初始化的时候。这使得改变一个应用的具体工厂变得很容易。它只需改变具体的工厂即可使用不同的产品配置,这是因为一个抽象工厂创建了一个完整的产品系列,所以整个产品系列会立刻改变。
3) 它有利于产品的一致性 当一个系列中的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,这一点很重要。而 A b s t r a c t F a c t o r y很容易实现这一点。
4) 难以支持新种类的产品 难以扩展抽象工厂以生产新种类的产品。这是因为A b s t r a c t F a c t o r y接口确定了可以被创建的产品集合。 支持新种类的产品就需要扩展该工厂接口,这将涉及A b s t r a c t F a c t o r y类及其所有子类的改变。我们会在实现一节讨论这个问题的一个解决办法。
6.实 现
下面是实现Abstract Factor模式的一些有用技术:
1) 将工厂作为单件 一个应用中一般每个产品系列只需一个C o n c r e t e F a c t o r y的实例。因此工厂通常最好实现为一个S i n g l e t o n。
2) 创建产品 A b s t r a c t F a c t o r y仅声明一个创建产品的接口,真正创建产品是由C o n c r e t e P r o d u c t子类实现的。最通常的一个办法是为每一个产品定义一个工厂方法(参见Factory Method) 。一个具体的工厂将为每个产品重定义该工厂方法以指定产品。虽然这样的实现很简单,但它却要求每个产品系列都要有一个新的具体工厂子类,即使这些产品系列的差别很小。
7. "开放-封闭"原则
"开放-封闭"原则要求系统对扩展开放,对修改封闭。对于涉及到多个产品族与多个产品等级结构的系统,其功能增强包括两方面:
增加产品族:(即增加Product A3或者productB3产品)Abstract Factory很好的支持了"开放-封闭"原则。
增加新产品的等级结构:(即增加Product C)需要修改所有的工厂角色,没有很好支持"开放-封闭"原则。
综合起来,抽象工厂模式以一种倾斜的方式支持增加新的产品,它为新产品族的增加提供方便,而不能为新的产品等级结构的增加提供这样的方便。