UML类图
代码示例
- 定义运算枚举
/**
* 运算枚举
*/
public enum TypeEnum {
/**
* 加
*/
ADD,
/**
* 减
*/
SUB,;
}
- 定义抽象产品类,包含一个抽象方法
/**
* 抽象产品(计算器)
*/
public interface ICalculator {
/**
* 计算numberA和numberB并返回操作结果
*
* @param numberA
* @param numberB
* @return 操作结果
*/
int compute(int numberA, int numberB);
}
- 产品A,继承了抽象产品类并实现其定义的方法
/**
* 具有加法运算功能的计算器
*/
public class CalculatorAdd implements ICalculator {
/**
* 将两个数进行加法运算
*
* @param numberA
* @param numberB
* @return 相加结果
*/
@Override
public int compute(int numberA, int numberB) {
return numberA + numberB;
}
}
- 产品B,继承了抽象产品类并实现其定义的方法
/**
* 具有减法运算功能的计算器
*/
public class CalculatorSub implements ICalculator {
/**
* 将两个数进行减法运算
*
* @param numberA
* @param numberB
* @return 相减结果
*/
@Override
public int compute(int numberA, int numberB) {
return numberA - numberB;
}
}
- 工厂类,用于获取相应的产品
/**
* 简单工厂
*/
public class CalculatorFactory {
/**
* 根据操作指令获取计算器操作对象
*
* @param type 操作指令
* @return 具有某一功能的计算器
*/
public static ICalculator calculate(TypeEnum type) {
ICalculator calculator = null;
switch (type) {
case ADD:
calculator = new CalculatorAdd();
break;
case SUB:
calculator = new CalculatorSub();
break;
default:
break;
}
return calculator;
}
}
- 客户端测试
public class CalculatorMain {
public static void main(String[] args) {
int numberA = 23;
int numberB = 18;
// 从简单工厂获取任意拥有某一功能的计算器
ICalculator calculate = CalculatorFactory.calculate(TypeEnum.ADD);
if (Objects.nonNull(calculate)) {
int result = calculate.compute(numberA, numberB);
System.out.println("result = " + result);
}
}
}
总结思考
简单工厂是一种创建型模式。根据开闭原则推导,在简单工厂模式应用中新增功能,需要添加相应的子类(对扩展开放,但同时也对修改开放了),并修改核心工厂类的相应方法(增加分支判断),具体的实例化延迟到了客户端进行选择,对于客户端来说,这去除了其与具体产品的直接依赖。