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 interface ICalculatorFactory {
/**
* 获取生产某一功能的计算器工厂实例
*
* @return 返回生产某一功能计算器的工厂实例
*/
ICalculator productCalculator();
}
- 具体工厂A,实现了获取相关产品的功能
public class CalculatorAddFactory implements ICalculatorFactory {
/**
* 获取具有加法运算功能的计算器实例
*
* @return 返回当前实例
*/
@Override
public ICalculator productCalculator() {
return new CalculatorAdd();
}
}
- 具体工厂B,实现了获取相关产品的功能
public class CalculatorSubFactory implements ICalculatorFactory {
/**
* 获取具有减法运算功能的计算器实例
*
* @return 返回当前实例
*/
@Override
public ICalculator productCalculator() {
return new CalculatorSub();
}
}
- 客户端测试
public class CalculatorMain {
public static void main(String[] args) {
int numberA = 23;
int numberB = 18;
// 从抽象工厂获取生产某一功能计算器的工厂实例
ICalculatorFactory calculatorFactory = new CalculatorSubFactory();
// 从当前工厂获取制造某一功能的计算器实例
ICalculator calculator = calculatorFactory.productCalculator();
int result = calculator.compute(numberA, numberB);
System.out.println("result = " + result);
}
}
总结思考
工厂方法同样也是一种创建型模式,是简单工厂模式的进一步抽象和推广。根据开闭原则,在工厂方法模式中新增功能,需要添加相应的功能类和工厂类(对扩展开放,对修改关闭),而具体的实例化则延迟到了工厂子类,并由客户端决定实例化哪一个工厂类。
对比简单工厂,工厂方法把简单工厂内部的逻辑判断移动到了客户端,当添加功能时,原本是要改工厂类的,而现在是修改客户端。