工厂模式实现了创建者和调用者的分离,分为简单工厂模式、工厂方法模式、抽象工厂模式。
实例化对象,用工厂方法代替new操作
将选择实现类、创建对象统一管理控制,将调用者跟实现类解耦。
简单工厂模式
因为工厂类的一般是使用静态方法,所以简单工厂模式也叫静态工厂模式,通过接收的参数的不同来返回不同的对象实例。用来生产同一等级结构中的任意产品。增加新的产品,需要修改以有的代码。
1 | public interface Car { |
1 | public class Audi implements Car { |
1 | public class Benz implements Car { |
1 | //简单工厂实现方式1 |
1 | //简单工厂实现方式2 |
1 | public class Client01 { |
简单工厂模式的UML图如下所示:
工厂方法模式
为了避免简单工厂模式的缺点(不满足开闭原则,即要进行扩展必须修改代码),出现了工厂方法模式。工厂方面模式和简单工厂模式最大的不同在于,简单工厂模式只有一个(对于一个项目或者一个独立模块而言)工厂类,而工厂方法模式有一组实现了相同接口的工厂类。
用来生产同一等级结构中的固定产品。支持增加任意产品
1 | public interface CarFactory { |
1 | public class AudiFactory implements CarFactory { |
1 | public class BenzFactory implements CarFactory { |
1 | public class Client02 { |
现在如果想要在增加一个BMW工厂,只需要在新建一个BMWFactory类实现Car接口就可以,现有的类和接口都不需要修改。
工厂方法模式UML图如下:
根据设计理论,工厂方法模式更优,但是由于工厂方法模式的结构、代码、编程难道和管理上都比简单工厂模式要复杂,所以实际上一般都使用简单工厂模式。
抽象工厂模式
用来生产不同产品族的全部产品。对于增加新的产品,无能为力;支持增加产品族。
在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。
抽象工厂模式UML图如下所示:
总结
简单工厂模式(静态工厂模式)
- 虽然某种程度不符合设计原则,但实际使用最多
工厂方法模式
- 不修改以有类的前提下,通过增加新的工厂类实现扩展
抽象工厂模式
- 不可以增加产品,可以增加产品族
典型应用场景
- JDK中Calendar的getInstance方法
- JDBC中Connection对象的获取
- Hibernate中SessionFactory创建Session
- Spring中IOC容器创建管理管理bean对象
- XML解析时的DocumentBuilderFactory创建解析器对象
- 反射中Class对象的newInstance()