目录
[显示]

1.摘要

工厂模式是面向对象编程中的常用模式,简单的说,工厂模式是利用面向对象设计对'new'进行的封装。工厂模式可以细分为三类:Simple Factory,Factory Method,Abstract Factory,本文介绍了这三类工厂模式的概念及特点。

2. Simple Factory

2.1. 针对问题

在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例。假设有以下创建语句:

如果对类Human的实例化很频繁,那么在程序中就会大量出现此类代码,于是自然可以想到方法把这类重复语句提取到一个函数中去。

2.2. 介绍

声明一个创建对象的接口,并封装了对象的创建过程。Factory这里类似于一个真正意义上的工厂(生产对象)。

2.3. 实现

2.4. 特点

1、调用者提供创建对象的参数,并得到对象的实例。调用者不需关注也无法得知具体创建过程。
2、工厂一般返回一个抽象接口的实例,调用者无需关注具体实现类,达到了解耦的目的。
3、在实践中可以使用反射或泛型代替类型判断。
4、工厂一般为单例类或静态函数。

3. Factory Method

2.1. 针对问题

在Simple Factory中,一般会通过判断传入参数来决定具体实例化哪个类,这样容易使得工厂类与产品类的耦合过多。
于是自然可以想到:利用面向对象方式可以将实例化过程分散到不同的子类,并向调用者提供一个抽象接口。

2.2. 介绍

定义一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method使一个类的实例化延迟到其子类。

2.3. 实现

UML静态图:
factory method模式

2.4. 特点

1、Factory Method模式使用"继承自抽象工厂的多个子类"来代替Simple Factory模式中的“上帝类”。
2、Factory Method模式可以和Simple Factory模式并存。
3、在实践中可以使用反射或泛型生成工厂实例。
4、Factory Method实例经常使用单例模式。

4. Abstract Factory

2.1. 针对问题

Simple Factory+Factory Method解决了某个接口极其派生类的实例化问题,那么假设我有多个需要实例化的接口,如何解决?最简单的方法是对每一个需要实例化的接口创建一个对应的Factory类。
那么,假如说我有一个创建GUI界面中“按钮”元素的工厂类。此时有一个新需求,需要把这套代码移植到mac上去,需要以下步骤:
1、增加一个派生类:由“创建按钮的工厂”接口派生新的类,实现mac相关的逻辑。
2、修改调用代码中“创建工厂实例”的逻辑,将原有代码中“创建windows风格按钮的工厂实例”替换为“创建mac风格按钮的工厂实例”。
如果元素种类增加到10个,那么这个工作就需要做10次,这显然是不合适的。容易想到,可以把有关联的一组Factory Method并入一个Factory类中,需求变更时时一组元素只要新增一个派生类即可。

2.2. 介绍

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

2.3. 实现

abstract factory模式

2.4. 特点

1、Abstract Factory模式针对的是相互间有联系的一类对象的创建。
2、若Abstract Factory模式中只有一个对象则退化为factory method。
4、Abstract Factory实例经常使用单例模式。
3、在实践中可以使用反射或泛型生成工厂实例。

5. 相关文章

1、设计模式总结

6. 参考文章

  1. 《设计模式_可复用面向对象软件的基础》,
  2. http://blog.csdn.net/hguisu/article/details/7505909