设计模式:Factory
1.摘要
工厂模式是面向对象编程中的常用模式,简单的说,工厂模式是利用面向对象设计对'new'进行的封装。工厂模式可以细分为三类:Simple Factory,Factory Method,Abstract Factory,本文介绍了这三类工厂模式的概念及特点。
2. Simple Factory
2.1. 针对问题
在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例。假设有以下创建语句:
1 2 3 |
Human axb=new Man(); axb.setAge(1); axb.setWeight(500); |
如果对类Human的实例化很频繁,那么在程序中就会大量出现此类代码,于是自然可以想到方法把这类重复语句提取到一个函数中去。
2.2. 介绍
声明一个创建对象的接口,并封装了对象的创建过程。Factory这里类似于一个真正意义上的工厂(生产对象)。
2.3. 实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public static Human createHuman(int sex,int age,int weight) { if(sex==male) { Human human=new Man(); human.setAge(age); human.setWeight(weight); return human; } else { //(....) } } |
2.4. 特点
1、调用者提供创建对象的参数,并得到对象的实例。调用者不需关注也无法得知具体创建过程。
2、工厂一般返回一个抽象接口的实例,调用者无需关注具体实现类,达到了解耦的目的。
3、在实践中可以使用反射或泛型代替类型判断。
4、工厂一般为单例类或静态函数。
3. Factory Method
2.1. 针对问题
在Simple Factory中,一般会通过判断传入参数来决定具体实例化哪个类,这样容易使得工厂类与产品类的耦合过多。
于是自然可以想到:利用面向对象方式可以将实例化过程分散到不同的子类,并向调用者提供一个抽象接口。
2.2. 介绍
定义一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method使一个类的实例化延迟到其子类。
2.3. 实现
UML静态图:
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. 实现
2.4. 特点
1、Abstract Factory模式针对的是相互间有联系的一类对象的创建。
2、若Abstract Factory模式中只有一个对象则退化为factory method。
4、Abstract Factory实例经常使用单例模式。
3、在实践中可以使用反射或泛型生成工厂实例。
5. 相关文章
1、设计模式总结
6. 参考文章
- 《设计模式_可复用面向对象软件的基础》,
- http://blog.csdn.net/hguisu/article/details/7505909
本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可,转载请注明作者及原网址。
抱歉,暂停评论。