• 出现的背景:当一个模块中使用到了一类对象,如果在使用到的位置直接具体创建出各种对象(显示new),则不易于该模块的扩展,因为当该类对象出现一种新对象时,需要修改该模块的代码,而简单工厂模式可以解决这个问题。
    • 作用:专门负责某类对象(实例)的创建。更具体的来说,就是在使用这类对象的模块中通过工厂中的方法,根据用户需求创建出相应的对象实例,并令父类引用指向这个对象实例(多态),从而实现了模块与这类对象的分离,当扩展了一种新对象时,只需要修改工厂方法,而这个模块无需变动。
    • 实例如下:

      • 首先定义运算器接口

        1. public interface Operation {
        2. void setNumberA(double numberA);
        3. void setNumberB(double numberB);
        4. double getResult();
        5. }
      • 定义该运算器接口的加、减、乘、除四种实现类 ```java class OperationAdd implements Operation { public double numberA; public double numberB;

        @Override public double getResult() { return numberA + numberB; }

        @Override public void setNumberA(double numberA) { this.numberA = numberA; }

        @Override public void setNumberB(double numberB) { this.numberB = numberB; } }

    class OperationSub implements Operation { public double numberA; public double numberB;

    1. @Override
    2. public double getResult() {
    3. return numberA - numberB;
    4. }
    5. @Override
    6. public void setNumberA(double numberA) {
    7. this.numberA = numberA;
    8. }
    9. @Override
    10. public void setNumberB(double numberB) {
    11. this.numberB = numberB;
    12. }

    }

    class OperationMul implements Operation { public double numberA; public double numberB;

    1. @Override
    2. public double getResult() {
    3. return numberA * numberB;
    4. }
    5. @Override
    6. public void setNumberA(double numberA) {
    7. this.numberA = numberA;
    8. }
    9. @Override
    10. public void setNumberB(double numberB) {
    11. this.numberB = numberB;
    12. }

    }

    class OperationDiv implements Operation { public double numberA; public double numberB;

    1. @Override
    2. public double getResult() {
    3. return numberA / numberB;
    4. }
    5. @Override
    6. public void setNumberA(double numberA) {
    7. this.numberA = numberA;
    8. }
    9. @Override
    10. public void setNumberB(double numberB) {
    11. this.numberB = numberB;
    12. }

    }

    1. - 定义简单工厂,负责Operation实现类的创建
    2. ```java
    3. public class OperationSimpleFactory {
    4. public static Operation createOperation(String operator){
    5. switch (operator){
    6. case "+": return new OperationAdd();
    7. case "-": return new OperationSub();
    8. case "*": return new OperationMul();
    9. case "/": return new OperationDiv();
    10. default: return null;
    11. }
    12. }
    13. }
    • 客户端使用简单工厂创建运算器对象
      1. public class CalculatorClient {
      2. public static void main(String[] args) {
      3. try {
      4. Scanner scanner = new Scanner(System.in);
      5. System.out.println("请输入第一个运算数");
      6. double numberA = scanner.nextDouble();
      7. System.out.println("请输入运算符");
      8. String operator = scanner.next();
      9. System.out.println("请输入第二个运算数");
      10. double numberB = scanner.nextDouble();
      11. Operation operation = OperationSimpleFactory.createOperation(operator);
      12. operation.setNumberA(numberA);
      13. operation.setNumberB(numberB);
      14. double result = operation.getResult();
      15. System.out.println(numberA + " " + operator + " " + numberB + " = " + result);
      16. } catch (Exception e){
      17. e.printStackTrace();
      18. }
      19. }
      20. }