20230419 8. 工厂方法模式 - 计算器

发布时间 2023-06-19 09:46:21作者: 流星<。)#)))≦

介绍

简单工厂模式的最大优点在于工厂类中包含必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。

就编程来说,我们应该尽量将长的代码分派切割成小段,再将每一小段'封装'起来,减少每段代码之间的耦合,这样风险就分散了,需要修改或扩展的难度就降低了。

工厂方法模式(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));
    }
}