1、简单工厂模式
1.1简单工厂模式的应用场景
简单工厂模式应用在多个业务(多个产品)实现有共同的动作属性,通过子类实现具体业务场景(具体产品);建立简单工厂通过控制条件决策生成具体的业务场景(具体的产品)。
实现步骤:
- 定义接口或抽象类
- 在接口或抽象类中定义一个虚方法
- 通过实现接口或继承抽象类的多个子类进行虚方法的重写,来实现各子类的具体业务场景
- 建立一个简单的工厂,通过控制条件的输入,决策工厂生产的产品是哪个具体的子类(即具体的业务场景)
1.2 UML图
1.3 实现方式
1.定义接口或抽象类,在接口或抽象类中定义一个虚方法
public interface Operation {
BigDecimal getResult(BigDecimal numberA, BigDecimal numberB) throws Exception;
}
2.通过实现接口或继承抽象类的多个子类进行虚方法的重写,来实现各子类的具体业务场景
/**
* 加操作实现类
*/
public class AddOperation implements Operation {
public BigDecimal getResult(BigDecimal numberA, BigDecimal numberB) throws Exception{
return numberA.add(numberB);
}
}
/**
* 减操作实现类
*/
public class SubOperation implements Operation {
public BigDecimal getResult(BigDecimal numberA, BigDecimal numberB) throws Exception{
return numberA.subtract(numberB);
}
}
/**
* 乘操作实现类
*/
public class MulOperation implements Operation {
public BigDecimal getResult(BigDecimal numberA, BigDecimal numberB) throws Exception{
return numberA.multiply(numberB);
}
}
/**
* 除操作实现类
*/
public class DivOperation implements Operation {
public BigDecimal getResult(BigDecimal numberA, BigDecimal numberB) throws Exception{
if(numberB.equals(BigDecimal.ZERO)){
throw new Exception("除数为0");
}
return numberA.divide(numberB);
}
}
3.建立一个简单的工厂,通过控制条件的输入,决策工厂生产的产品是哪个具体的子类(即具体的业务场景)
/**
* 简单工厂
*/
public class SimpleFactory {
public static Operation createOperation(String operate){
Operation operation=null;
switch(operate){
case "+":
operation=new AddOperation();
break;
case "-":
operation=new SubOperation();
break;
case "*":
operation=new MulOperation();
break;
case "/":
operation=new DivOperation();
break;
}
return operation;
}
}
4.客户端代码
public class MainToken {
public static void main(String[] args) {
try{
Operation add= SimpleFactory.createOperation("+");
Operation sub= SimpleFactory.createOperation("-");
Operation mul= SimpleFactory.createOperation("*");
Operation div= SimpleFactory.createOperation("/");
System.out.println(add.getResult(new BigDecimal("1"),new BigDecimal("2")));
System.out.println(sub.getResult(new BigDecimal("1"),new BigDecimal("2")));
System.out.println(mul.getResult(new BigDecimal("1"),new BigDecimal("2")));
System.out.println(div.getResult(new BigDecimal("1"),new BigDecimal("2")));
}catch(Exception e){
}
}
}
实验结果:
3
-1
2
0.5
Process finished with exit code 0
1.4 优缺点分析
简单工厂模式实现各个具体业务场景的子类不耦合,不相互干扰,减小维护出错率,产品的业务实现与工厂生产产品不耦合,但是工厂生产产品受到控制条件的统一控制,新加入一个产品需要增加一个子类和改动简单工厂的控制条件这样违反了扩展开放-修改关闭中的修改关闭原则。所以简单工厂模式可以进一步改进。