简单工厂模式
简单工厂模式的思想就是用一个单独的类来管理实例化不同子类的过程,这个类就是工厂类。下面我们用一个简单的计算器程序来介绍,计算器只包含加减乘除功能。
下面是UML图
图中可以看到,运算类是四种操作类的父类,而简单工厂类则依赖于运算类
下面是实现代码
操作类 Operation
public class Operation {
private double num1;
private double num2;
public double getNum1() {
return num1;
}
public void setNum1(double num1) {
this.num1 = num1;
}
public double getNum2() {
return num2;
}
public void setNum2(double num2) {
this.num2 = num2;
}
public double getResult() { // 返回运算结果
return 0;
}
}
加减乘除类
public class OperationAdd extends Operation {
@Override
public double getResult() { //加法
return this.getNum1()+this.getNum2();
}
}
public class OperationSub extends Operation {
@Override
public double getResult() { //减法
return this.getNum1()-this.getNum2();
}
}
public class OperationMul extends Operation {
@Override
public double getResult() {
return this.getNum1()*this.getNum2(); //乘法
}
}
public class OperationDiv extends Operation {
@Override
public double getResult() { //除法
if(this.getNum2()==0) {
System.out.println("除数不能为0");
return 0;
}
return this.getNum1()/this.getNum2();
}
}
然后是工厂类
public class OperationFactory {
public static Operation createOperation(String op) {
Operation operation=null;
switch (op) { //根据传进来的字符串选择要实例化的对象
case "+":
operation=new OperationAdd();
break;
case "-":
operation=new OperationSub();
break;
case "*":
operation=new OperationMul();
break;
case "/":
operation=new OperationDiv();
break;
default:
break;
}
return operation;
}
}
最后是客户端的代码
public class User {
public static void main(String[] args) {
Operation operation=null;
String op="-"; //可以使用四种操作的任意一种
operation = OperationFactory.createOperation(op);
operation.setNum1(1);
operation.setNum2(2);
System.out.println(operation.getResult());
}
}
我们只需要输入运算符号,工厂就帮我们实例化出想要的对象,利用上转型对象,返回父类的方式实现了结果。
总结 :
1、简单工厂模式最大的优点在于工厂类中可以判断客户的的选择来动态实例化相关的类,对于客户端来说,去除了具体产品的依赖。
2、缺点就是:很明显工厂类集中了对所有实例创建的逻辑,如果我们要新增子类或者改变方法的话,就得每次都修改工厂类里面的代码,工厂类中的代码就会十分臃肿,这就等于说我们不进开放了扩展,还开放了修改,这样就违反了开放-封闭原则。
你可能在不知不觉中已经用到过这种模式了,但简单工厂模式并不属于23种设计模式之一,下面介绍他的改进版本:工厂方法模式