1.概念
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。
简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。
简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
2.实际应用-----两个数的计算器
Operation父类:
定义两个数
定义计算方法calculate(也可不定义,因为具体计算会用子类的重写方法)
public class Operation {
private Double numberA;
private Double numberB;
public Double calculate() throws Exception {
return new Double(0D);
}
public Operation(Double numberA, Double numberB) {
this.numberA = numberA;
this.numberB = numberB;
}
public Double getNumberA() {
return numberA;
}
public void setNumberA(Double numberA) {
this.numberA = numberA;
}
public Double getNumberB() {
return numberB;
}
public void setNumberB(Double numberB) {
this.numberB = numberB;
}
}
具体的加减乘除子类
重写计算方法
public class OperationAdd extends Operation {
@Override
public Double calculate() {
return getNumberA() + getNumberB();
}
}
public class OperationDiv extends Operation {
@Override
public Double calculate() throws Exception {
if (Objects.equal(0D, getNumberB())) {
throw new Exception("除数不能为0");
}
return getNumberA() / getNumberB();
}
}
public class OperationMul extends Operation {
@Override
public Double calculate() {
return getNumberA() * getNumberB();
}
}
public class OpreationSub extends Operation {
@Override
public Double calculate() {
return getNumberA() - getNumberB();
}
}
创建具体要是用的计算方式的工厂类
前提:
必须传入一个计算符号用于告知工厂类该创建哪个子类
public class SimpleFactory {
public static Operation createOperate(String operator) {
Operation operation = null;
switch (operator) {
case "+":
operation = new OperationAdd();
break;
case "-":
operation = new OpreationSub();
break;
case "*":
operation = new OperationMul();
break;
case "/":
operation = new OperationDiv();
break;
default:
System.out.println("输入的计算符号不合法!");
break;
}
return operation;
}
}
使用
public class Main {
public static void main(String[] args) {
// 传入运算符,告诉简单工厂类该创建哪种类型的子类
Operation operation = SimpleFactory.createOperate("+");
operation.setNumberA(1.0D);
operation.setNumberB(10.9D);
Double result = null;
try {
result = operation.calculate();
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println(result);
}
}
}