工厂模式

来源:互联网 发布:人类基因组计划 知乎 编辑:程序博客网 时间:2024/06/13 11:28

工厂模式属于构造模式的一种,用于创建对象。在软件工程中应用很广泛,我们在编程中常常会遇到工厂模式的实现。

一、工厂模式演化


1.创建一个类的对象: 
new Object();
2.创建一系列类对象,这些类有共同的父类或接口,且类个数固定:
使用一个工厂类,类中有个静态方法根据参数不同构造不同的产品对象。可以用switch、反射来实现,网上例子很多。

简单工厂UML

3.创建一系列类对象,这些类有共同的父类或接口,且经常需要拓展新的子类:
由于简单工厂的子类拓展需要修改工厂类的创建产品方法,不符合开闭原则。很容易想到将简单工厂的工厂类进行抽象,这样每一种子类对应一种工厂,这样拓展子类就不需要修改原来的代码。


4.创建多个系列类对象,子类继承自不同的父类或接口,且不同系列的类间存在依赖关系:
在工厂中添加构造相互依赖对象的方法,使得每个工厂能生成相互依赖的产品。



二、工厂方法模式和抽象工厂模式的区别


对于工厂模式初学者来说,常常无把握这两者的区别。我们很容易从上文看出,抽象工厂是针对多个系列类且类间有依赖关系的对象的创建,这看起来不就是在工厂方法模式的工厂接口里加了创建对象的方法吗?是的,在现象上的确如此,但工厂方法和抽象工厂模式之所以是两种设计模式,是因为它们的目的完全不同。工厂方法强调的创建对象的方法,抽象工厂主要是对工厂的抽象。

工厂方法模式更强调产生子类的方法,实际使用中的大多数场景可以描述成:每个AA都会有一个BB,于是就把产生BB的方法抽象成接口让所有的AA去实现。
例如:java中集合中产生迭代器的Iterator方法。
java Sql中各种数据库获取链接的的getConnection方法。
android 中的Fragement 中产生View的OnCreateView,Service中产生Binder的OnBind方法
甚至java中每个对象的toString方法都可以算工厂方法

抽象工厂模式主要是对工厂的抽象,使用场景可以描述成:A1 A2 ...、  B1 B2 ...,A B的排列组合那么多可不能给客户端瞎用,那就抽象出一个工厂来提供一个固定的组合吧。
但在实际编码中很少能遇到复杂对象组合的例子。


0 0