简单工厂模式
什么是简单工厂模式?
简单来说:简单工厂模式就是通过创建一个工厂类,这个工厂类会根据输入参数的不同返回不同的类的实例,被创建的实例通常都有同一个父类。
简单工厂模式优点?
- 对象的创建交由工厂,客户端可以免除直接创建对象的职责,且不用关心对象创建的过程。
- 创建对象时,无需确定要创建哪个类,不需要知道类名,只需要知道参数即可。
简单工厂模式缺点?
- 对象的创建全部交由工厂类,逻辑繁多,职责过重,一旦异常会影响调用该工厂的所有方法。
- 简单工厂模式会导致类的个数增加,增加系统的复杂度。
- 系统扩展困难,一旦增加新类,便不得不修改工厂类的逻辑,违反开闭原则,同时也可能导致逻辑过于复杂。
简单工厂的适用环境?
- 工厂类负责创建的类的对象比较少,工厂方法业务逻辑简单。
- 客户端只知道传入工厂类的参数,对如何创建对象不关心。
举例(以加减乘除计算器为例)
- 创建一个抽象计算类
/*
* 运算类(父类)
*/
public abstract class Operation {
// 加减乘除抽象方法
public abstract double getResule(double numA, double numB);
}
- 创建加减乘除四个子类
/**
* 加法类
*/
public class AddOperation extends Operation{
@Override
public double getResule(double numA, double numB) {
// TODO Auto-generated method stub
return numA + numB;
}
}
/*
* 减法类
*/
public class SubOperation extends Operation{
@Override
public double getResule(double numA, double numB) {
// TODO Auto-generated method stub
return numA - numB;
}
}
/*
* 乘法类
*/
public class MulOperation extends Operation{
@Override
public double getResule(double numA, double numB) {
// TODO Auto-generated method stub
return numA * numB;
}
}
/*
* 除法类
*/
public class DivOperation extends Operation{
@Override
public double getResule(double numA, double numB) {
// TODO Auto-generated method stub
if(numB == 0) {
throw new RuntimeException("除数不能为0.");
}else {
return numA / numB;
}
}
}
- 创建简单工厂类
/*
* 简单工厂类
*/
public class OperationFactory {
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;
default:
break;
}
return operation;
}
}
- 创建客户端测试类,打印输出结果
/*
* 客户端测试类
*/
public class Main {
public static void main(String[] args) {
double result = OperationFactory.createOperation("+").getResule(10, 20);
System.out.println(result);
}
}
输出结果为: