定义
把被创建的对象称为“产品”,把创建产品的对象称为“工厂”。如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫“简单工厂模式”。
举例
业务场景:实现计算器的基本运算(加减乘除)
UML类图
代码实现
1、定义操作接口
/**
* 操作接口
*/
public interface Operation {
double getResult(double number1,double number2) throws Exception ;
}
2、定义具体操作类
/**
* 加法
*/
public class OperationAdd implements Operation{
@Override
public double getResult(double number1, double number2) {
return number1+number2;
}
}
/**
* 减法
*/
public class OperationSub implements Operation{
@Override
public double getResult(double number1, double number2) {
return number1*number2;
}
}
/**
* 乘法
*/
public class OperationMul implements Operation{
@Override
public double getResult(double number1, double number2) {
return number1-number2;
}
}
/**
* 除法
*/
public class OperationDiv implements Operation{
@Override
public double getResult(double number1, double number2) throws Exception {
if (number2 == 0) {
throw new Exception("除数不能为0!");
}
return number1/number2;
}
}
3、定义简单工厂类
/**
* 简单工厂
*/
public class OperationFactory {
public static Operation createOperation(String oper){
Operation operation=null;
switch (oper){
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 MainTest {
public static void main(String[] args) throws Exception {
Operation add=OperationFactory.createOperation("+");
Operation sub=OperationFactory.createOperation("-");
Operation mul=OperationFactory.createOperation("*");
Operation div=OperationFactory.createOperation("/");
System.out.println(add.getResult(2, 1));
System.out.println(sub.getResult(2, 1));
System.out.println(mul.getResult(2, 1));
System.out.println(div.getResult(2, 1));
}
}
5、控制台输出
3.0
2.0
1.0
2.0
这样做的好处是无需提供具体的子类类名,只需要提供一个字符串即可得到相应的实例对象。这样的话,当子类的类名更换或者增加子类时我们都无需修改客户端代码,只需要在简单工厂类上增加一个分支判断代码即可。使用这种模式,我们在生成工厂的时候可以加一些业务代码,如日志、判断业务等。
优点
1、可以对创建的对象进行一些 “加工” ,而客户端并不知道,因为工厂隐藏了这些细节。就好比本来可以在工厂里生产的东西,拿来自己手工制作,不仅麻烦以后还不好维护。
缺点
1、当需要创建的对象很多时,会导致这个简单工厂类很庞大臃肿、耦合性高。
2、增加新产品时会违背“开闭原则”。
参考
1、https://blog.csdn.net/u012156116/article/details/80857255
2、《大话设计模式》