简单工厂模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种 GOF 设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
简单工厂的结构图
简单工厂模式中的角色:
- Factory:工厂类,简单工厂模式的核心,负责实现所实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
- IProduct:抽象产品类,简单工厂所创建的所有对象的父类,负责描述所有实例的共有的公共接口。
- Product:具体产品类,这是简单工厂模式的创建目标。
简单工厂模式的简单实现
(1) 抽象产品类,其中抽象方法用于返回运算结果。
public abstract class Operation {
private double x;
private double y;
public void setX(double x) {
this.x = x;
}
public void setY(double y) {
this.y = y;
}
public double getX() {
return x;
}
public double getY() {
return y;
}
public abstract double getResult() throws Exception;
}
(2) 具体产品类
继承 Operation,并实现其 getResult 方法,返回计算结果。
加法类
public class OperationAdd extends Operation {
@Override
public double getResult() {
return getX() + getY();
}
}
减法类
public class OperationSub extends Operation {
@Override
public double getResult() {
return getX() - getY();
}
}
乘法类
public class OperationMul extends Operation {
@Override
public double getResult() {
return getX() * getY();
}
}
除法类
public class OperationDiv extends Operation {
@Override
public double getResult() {
double x = getX();
double y = getY();
if (y == 0) {
throw new ArithmeticException("除数不能为0");
}
return x / y;
}
}
(3) 工厂类
创建一个工厂类,提供一个静态方法 createOperate 用来生成计算器。
public class OperationFactory {
public static Operation createOperate(String operate) {
Operation operation = null;
switch (operate) {
case "+":
operation = new OperationAdd();
break;
case "-":
operation = new OperationSub();
break;
case "*":
operation = new OperationMul();
break;
case "/":
operation = new OperationDiv();
break;
}
return operation;
}
}
(4) 客户端调用工厂类
public class Calculator {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("输入运算符:");
String operation = scanner.next();
Operation operate = OperationFactory.createOperate(operation);
System.out.print("输入第一个数字:");
operate.setX(scanner.nextDouble());
System.out.print("输入第二个数字:");
operate.setY(scanner.nextDouble());
try {
System.out.print("结果:" + operate.getResult());
} catch (Exception e) {
e.printStackTrace();
}
}
}
简单工厂模式的使用场景
使用场景:
工厂类负责创建的对象比较少。
客户只需知道传入工厂类的参数,而无须关心对象的逻辑。
简单工厂模式的优缺点
优点:使用户根据参数获得对应的类实例,避免了直接实例化类,减低了耦合度。
缺点:可实例化的类型在编译期间邮件已经被确定。如果增加新类型,则需要修改工厂,这违背了开发封闭原则。简单工厂需要知道要生成的类型,其当子类过多或者子类层次过多时不适合使用。