《设计模式》笔记之抽象工厂模式

来源:互联网 发布:软文推广平台源码 编辑:程序博客网 时间:2024/04/29 15:03

抽象工厂模式

===========================

1.模式目标:为创建相关或信赖的对象提供统一的接口。

2.动机:在设计窗口系统时,不仅需要为不同的窗口部件分别设计类(窗口,滚动条等),而且对于一个跨平台系统甚至有多个皮肤的系统而言,还需要为不同的外观分别设计样式(如Linux上的Motif,Windows上的样式等),如果为窗口部件分别设计适用于不同主题的类,也就太繁琐了。

可以采用以下方法:为不同样式的窗口系统分别设计类以产生对应的对象,它们具有一些共同的操作(如创建滚动条、创建窗口等),把这些公用的操作合并为一个接口类,利用面向对象语言的多态特性(话说没看设计模式前一直搞不懂多态有什么用,这下豁然开朗),客户程序只需要对这个统一的接口进行编程,而不再需要分别去引入不同的具体的类。以后添加样式对象时,只需要再用一个类来继承这个接口类并实现相应的具体操作即可。

对于窗口设计系统,类图如下:



3.模式用途:在以下情况下使用:

(1)系统独立于产品的创建、组合和表示;

(2)系统需要一组功能类似的大量产品;

(3)这些对象彼此联系,一同使用;

(4)开发者想要提供这些产品的类库,并需要面向接口编程,而非面向实现编程。

4.类图:


5.模式效用:

(1)将客户程序与具体实现的类相隔离,客户程序仅需针对接口编程。产品类名在实现的工厂类内被隔离,不出现在客户程序中。

(2)使得交换具体实现的类更加容易。具体的工厂类仅在实例化时才出现,并且只出现这一次。可以通过不同的配置来改变这些具体类。

(3)提高了产品的兼容性。不同的产品系列由同一个具体工厂类来产生,保证了它们之间的兼容性。

(4)不易支持新添加的产品。如果新添加了产品,必须修改抽象工厂类及其子类。下面会介绍一种方法来解决这个问题。

6.实现:

(1)在每一个产品系列中只需要一个具体的工厂类,因此可以使用单例模式来保证只有一个实例。

(2)抽象工厂类只声明了一些接口,实际创建产品是由具体的工厂类来实现,这时可以针对每一个产品用工厂模式来实现,但当产品发生变化时需要添加新的子类。如果产品系列太多,实际的具体工厂类可以用原型模式实现。

(3)每添加一个产品系列,都需要把抽象工厂的类继承体系修改一遍。一个解决方法(灵活但安全性降低)是:添加产生对象的参数,该参数标示出产生的对象类型,可以是一个类标识符、整型、字符串等等。这在动态类型语言如Smalltalk中更容易实现,在C++中,只有在所有的对象具有单一的抽象基类,从而使客户程序强制使用正确的类型。但伴随的问题是:所有的产品都返回相同的抽象接口,客户程序难以分辨它的类型。

7.相关的模式:

经常与工厂模式、原型模式一同使用,具体的工厂类经常使用单例模式。

原创粉丝点击