这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战
概述
简单工厂模式(Simple Factory Pattern)属于创建型模式,创建实例的方法通常为静态方法,因此又被称为静态工厂方法(Static Factory Method)。
简单工厂模式就是工厂类根据不同的参数创建不同的实例。例如:张三开了一家水壶制造厂,当客户需要某种水壶时,客户不需要知道水壶是如何生产的,只需要告诉张三自己的水壶类型,就可以得到自己想要的水壶了。水壶制造厂就是工厂(Factory),客户告知的水壶类型就是参数,水壶制造厂生产出来的水壶就是产品(Product)。
注意:
- 工厂中创建实例的方法通常为静态方法,但也可以不是。
- 被创建的实例通常都具有共同的父类,但也可以省略。
- 简单工厂模式,并不属于 GoF(Gang of Four) 中的设计模式,可能是因为它违反了开闭原则吧。
结构
- Factory:工厂类,简单工厂模式的核心,负责创建具体的产品,该方法供外部直接调用。可将其与抽象产品类合并,但不建议。
- Product:抽象产品类,在 Java 中为接口或抽象类,是所有具体产品的父类,用于描述具体产品的共有属性,可被省略,但不建议。
- ConcreteProduct:具体产品类,它是工厂类要的创建目标,需要实现抽象产品类所定义的抽象方法。
优点
- 免除了客户端直接创建具体的产品。因为工厂类中包含的逻辑判断,可以决定在什么时候创建哪一个具体的产品实例。
- 客户端只需要告知需求(参数),不需要知道创建具体产品的细节(具体产品的类名)。
- 通过引入配置文件,在不修改客户端的情况下更换和添加新的具体产品类。
缺点
- 工厂类集中了所有产品的创建逻辑,职责过重,一旦异常,整个系统都会受到影响。
- 会增加系统中类的个数(工厂类和抽象产品类),增加了系统的复杂度和理解难度,这也是设计模式的通病。
- 系统扩展困难,违反了开闭原则,一旦需要增加新产品,就不得不修改工厂类的逻辑,在产品类型较多时,会造成逻辑过于复杂。
- 工厂类中创建实例的方法通常为静态方法,无法形成基于继承的等级结构。
应用场景
- 工厂类负责创建对的对象较少;
- 客户端只知道传入工厂类的参数,对如何创建对象不关心。
JDK 中的应用
简单工厂模式在 JDK 源码中无处不在,例如:java.util.Calendar。
DateFormat 就是工厂类,它与抽象产品类进行了合并,其具体产品类包括 BuddhistCalendar、JapaneseImperialCalendar、GregorianCalendar。