简单工厂模式又叫静态方法模式(因为工厂类定义了一个静态方法),负责生产一类对象。
简单工厂的组成模型如下:
| 组成 | 关系 | 作用 |
|---|---|---|
| 抽象产品(Product) | 具体产品的父类 | 提供描述产品的公共接口 |
| 具体产品(Concrete Product) | 具体产品类,工厂生产的目标类 | 具体产品 |
| 工厂(Factory) | 外界调用 | 根据不同的入参创建不同的产品类实例 |
简单工厂模式要解决的问题
将“类实例化的操作”与“使用对象的操作”分开,让使用者不用知道具体参数就可以实例化出所需要的“产品”类,从而避免了在客户端代码中显式指定,实现了解耦。即使用者可直接消费产品而不需要知道其生产的细节。
**
简单工厂模式的优点
- 将创建实例的工作与使用实例的工作分开,使用者不必关心类对象如何创建,实现了解耦;
- 把初始化实例时的工作放到工厂里进行,使代码更容易维护。 更符合面向对象的原则 & 面向接口编程,而不是面向实现编程
简单工厂模式的缺点
- 工厂类集中了所有实例(产品)的创建逻辑,一旦这个工厂不能正常工作,整个系统都会受到影响;
- 违背“开闭原则”,一旦添加新产品就不得不修改工厂类的逻辑,这样就会造成工厂逻辑过于复杂;
- 简单工厂模式由于使用了静态工厂方法,静态方法不能被继承和重写,会造成工厂角色无法形成基于继承的等级结构
简单工厂模式应用场景
- 客户如果只知道传入工厂类的参数,不关心创建对象的逻辑;
- 工厂类负责创建的对象(具体产品)比较少
简单工厂模式实现步骤
- 创建产品抽象类,提供具体产品的公共接口;
- 创建具体产品类,继承至抽象类,实现接口;
- 创建工厂类,根据不同的入参创建不同的具体产品;
- 外界调用工厂类的静态方法,传入不同的入参,创建出不同的产品;
简单工厂模式使用示例
使用简单工厂模式生产不同的Pencil。
public class SimpleFactory {/*** 抽象产品类,并定义具体产品的基本功能*/public interface IPencil {void write();}/*** 具体产品类:钢笔*/public static class Fountain implements IPencil {@Overridepublic void write() {System.out.println("使用钢笔写字");}}/*** 具体产品类:铅笔*/public static class Pencil implements IPencil {@Overridepublic void write() {System.out.println("使用铅笔写字");}}/*** 具体产品类:毛笔*/public static class WritingBrush implements IPencil {@Overridepublic void write() {System.out.println("使用毛笔写字");}}/*** 具体产品生产工厂*/public static class PenFactory {public static IPencil createPencil(Class<? extends IPencil> clazz) {try {Constructor<? extends IPencil> declaredConstructor = clazz.getDeclaredConstructor();return declaredConstructor.newInstance();} catch (Exception e) {e.printStackTrace();}return null;}}public static void main(String[] args) {// 生产铅笔PenFactory.createPencil(Pencil.class).write();// 生产钢笔PenFactory.createPencil(Fountain.class).write();// 生产毛笔PenFactory.createPencil(WritingBrush.class).write();}}
结果输出:
:::success
使用铅笔写字
使用钢笔写字
使用毛笔写字
:::
