1. 介绍
1.1 定义
- 简单工厂模式(Simple Factory Pattern)又称静态工厂方法,它属于创建型模式
- 专门定义一个工厂类负责创建其他类的实例,可以根据参数的不同返回不同类的实例,被创建的实例通常都具有相同的父类
1.2 作用
- 将实例的创建与实例的业务处理分开,降低系统的耦合度,即使用者可直接消费产品而不需要知道生产的细节
2. 模式结构
2.1 UML类图
2.2 模式组成
- 工厂(Factory):被外部调用,根据参数的不同创建不同具体产品类的实例
- 抽象产品(Product):具体产品的父类,描述产品的公共接口
- 具体产品(Concrete Product):描述生产的具体产品
3. 代码实例
3.1 背景
- 利用简单工厂模式实现两数的加减运算
3.2 应用
-
步骤1 创建抽象产品类,定义具体产品的公共接口
abstract class Operator { public abstract int doOperator(int x, int y); }
-
步骤2 创建具体产品类,定义生产的具体产品
public class OperatorAdd extends Operator { @Override public int doOperator(int x, int y) { return x + y; } }
public class OperatorSubtract extends Operator { @Override public int doOperator(int x, int y) { return x - y; } }
-
步骤3 创建工厂类,定义静态方法根据传入参数创建不同具体产品类的实例
public class OperatorFactory { public static Operator getOperator(String operator) { if (operator.equalsIgnoreCase("ADD")) { return new OperatorAdd(); } else if (operator.equalsIgnoreCase("SUBTRACT")) { return new OperatorSubtract(); } else { return null; } } }
-
步骤4 外界通过调用工厂类的静态方法,传入不同的参数从而创建不同具体产品类的实例
public class Demo { public static void main(String[] args) { Operator operator = OperatorFactory.getOperator("ADD"); System.out.println(operator.doOperator(1, 5)); } }
4. 优点
- 将创建实例的工作和使用实例的工作分开,使用者不需要关心对象如何创建,实现了解耦
- 更符合面向对象的原则,面向接口编程,而不是面向实现编程
- 使用者不需要知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量。
5. 缺点
- 每次新增一个产品的时候,都需要修改工厂类的逻辑,违反开闭原则
- 工厂类集中了所有产品的创建逻辑,一旦不能工作,整个系统会受到影响
6. 应用场景
- 使用者只知道传入工厂类的参数,且不关心创建对象的逻辑
- 工厂类负责创建的具体产品比较少的场景(工厂类的逻辑不至于太复杂)