20230419 8. 工厂方法模式 - 计算器
介绍
简单工厂模式的最大优点在于工厂类中包含必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
就编程来说,我们应该尽量将长的代码分派切割成小段,再将每一小段'封装'起来,减少每段代码之间的耦合,这样风险就分散了,需要修改或扩展的难度就降低了。
工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
从简单工厂模式到工厂方法是一种升级。当只有一个工厂时,就是简单工作模式,当有多个工厂时,就是工厂方法模式
工厂方法模式是简单工厂模式的进一步抽象和推广。
工厂方法模式本质就是对获取对象过程的抽象
工厂方法的优点:
- 对于复杂的参数的构造对象,可以很好地对外层屏蔽代码的复杂性
- 很好的解耦能力
将计算器示例升级为工厂方法模式:
代码示例 - 计算器
工厂接口 Creator
public interface IFactory {
Operation createOperation(String oper);
}
具体工厂实现 ConcreteCreator
/**
* 初级运算
*
*/
public class BasicOperationFactory implements IFactory {
@Override
public Operation createOperation(String oper) {
Operation operation = null;
switch (oper) {
case "+": {
operation = new Add();
break;
}
case "/": {
operation = new Div();
break;
}
}
return operation;
}
}
/**
* 高级运算
*
*/
public class AdvanceOperationFactory implements IFactory {
@Override
public Operation createOperation(String oper) {
Operation operation = null;
switch (oper) {
case "pow": {
operation = new Pow();
break;
}
}
return operation;
}
}
产品 Product
public abstract class Operation {
public abstract double getResult(double a, double b);
}
具体产品实现 ConcreteProduct
public class Pow extends Operation {
@Override
public double getResult(double a, double b) {
return Math.pow(a, b);
}
}
产品工厂 OperationFactory
public class OperationFactory {
/**
* 与 IFactory 中定义的方法签名相同,但是 static
*
* @param oper
* @return
*/
public static Operation createOperation(String oper) {
IFactory factory = null;
switch (oper) {
case "+":
case "/": {
factory = new BasicOperationFactory();
break;
}
case "pow": {
factory = new AdvanceOperationFactory();
break;
}
default: {
throw new RuntimeException("操作不支持::" + oper);
}
}
return factory.createOperation(oper);
}
}
客户端
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
double a = scanner.nextDouble();
String oper = scanner.next();
double b = scanner.nextDouble();
Operation operation = OperationFactory.createOperation(oper);
System.out.println(operation.getResult(a, b));
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)