简单工厂模式通常是定义一个工厂类,这个类可以根据不同变量返回不同类的产品实例,它是一种对象创建型模式 .(不属于23种Gof设计模式之一)
以实现一个计算器为例:(主要有三个角色)
1. 抽象产品类
抽象产品类,简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口.
// ,所有实例所共有的公共接口
abstract class Operation {
public int numA;
public int numB;
public abstract int GetResult();
}
2. 具体产品类
//创建具体产品类:加减乘除
public class Add extends Operation{
@Override
public int GetResult() {
return numA + numB;
}
}
public class Sub extends Operation{
@Override
public int GetResult() {
return numA - numB;
}
}
public class Mul extends Operation{
@Override
public int GetResult() {
return numA * numB;
}
}
public class Div extends Operation{
@Override
public int GetResult() {
if (numB == 0){
throw new RuntimeException("被除数为0");
}
return numA / numB;
}
}
3. 创建工厂类
// 工厂角色,简单工厂模式的核心,它负责实现创建所有实例的内部逻辑
class OperationFactory {
public static Operation CreateOperation (char operate) {
Operation oper = null;
switch(operate) {
case '+':
oper = new Add();
break;
case '-':
oper = new Sub();
break;
case '*':
oper = new Mul();
break;
case '/':
oper = new Div();
break;
default:
break;
}
return oper;
}
}
4. 测试代码
public class SimpleFactoryPattern {
public static void main(String[] args) {
int numA = 10;
int numB = 3;
int result = 0;
Operation oper = OperationFactory.CreateOperation('+');
oper.numA = numA;
oper.numB = numB;
result = oper.GetResult();
System.out.println(numA + " + " + numB + " = " + result);
}
}
5. 优缺点分析
5.1 优点
- 使用工厂对象创建具体的产品对象,从而使得对象的使用和创建过程进行的分离
- 客户端不需要关注对象是谁创建的,只要通过工厂中静态方法就可以直接获取其需要的对象
5.2 缺点
- 工厂类集中了所有实例的创建逻辑,违背了高内聚责任分配原则
- 随着系统中具体产品类不断增多,势必要不断修改工厂类,不易维护和扩展, 也违背了开放封闭原则
简单工厂模式,也充分体现了面向对象的三大特征:封装,继承,多态