大话设计模式-工厂模式

2018-12-09  本文已影响0人  飞飞幻想

1.简单工厂

实现一个计算器控制台程序,要求输入两个数和运算符号,得到结果。

// 抽象产品:计算抽象类
  public static abstract class Operation {
    protected double a;
    protected double b;

    abstract double getResult();
  }

  // 具体产品:加法操作
  public static class OperationAdd extends Operation {
    @Override
    public double getResult() {
      return a + b;
    }
  }

  // 具体产品:减法操作
  public static class OperationSub extends Operation {
    @Override
    public double getResult() {
      return a - b;
    }
  }

  // 具体产品:乘法操作
  public static class OperationDiv extends Operation {
    @Override
    public double getResult() {
      if (b == 0) throw new RuntimeException("被除数不能为0");
      return a / b;
    }
  }

  // 具体产品:减法操作
  public static class OperationMul extends Operation {
    @Override
    public double getResult() {
      return a * b;
    }
  }

  // 简单工厂
  public static class OperationFactory {
    public static Operation createOperation(String operator) {
      Operation operation = null;
      switch (operator) {
        case "+":
          operation = new OperationAdd();
          break;
        case "-":
          operation = new OperationSub();
          break;
        case "*":
          operation = new OperationMul();
          break;
        case "/":
          operation = new OperationDiv();
          break;
      }
      if (operation == null) {
        throw new RuntimeException(String.format("不支持的操作符[%s]", operator));
      }
      return operation;
    }
  }

  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入数字A:");
    String a = sc.nextLine();
    System.out.println("请选择运算符号(+、-、*、/):");
    String operator = sc.nextLine();
    Operation operation = OperationFactory.createOperation(operator);
    System.out.println("请输入数字B:");
    String b = sc.nextLine();
    operation.a = Double.parseDouble(a);
    operation.b = Double.parseDouble(b);
    System.out.println("计算结果:" + operation.getResult());
  }

简单工厂模式的优点:

简单工厂模式的缺点:

2.工厂方法

// 抽象产品:计算抽象类
  public static abstract class Operation {
    protected double a;
    protected double b;

    abstract double getResult();
  }

  // 具体产品:加法操作
  public static class OperationAdd extends Operation {
    @Override
    public double getResult() {
      return a + b;
    }
  }

  // 具体产品:减法操作
  public static class OperationSub extends Operation {
    @Override
    public double getResult() {
      return a - b;
    }
  }

  // 工厂方法
  public static abstract class OperationFactory {
    public abstract Operation createOperation();
  }

  public static class OperationFactoryAdd extends OperationFactory {
    @Override
    public Operation createOperation() {
      return new OperationAdd();
    }
  }


  public static class OperationFactorySub extends OperationFactory {
    @Override
    public Operation createOperation() {
      return new OperationSub();
    }
  }

  public static OperationFactory createFactory(String operator) {
    OperationFactory of = null;
    switch (operator) {
      case "+":
        of = new OperationFactoryAdd();
        break;
      case "-":
        of = new OperationFactorySub();
        break;
    }
    if (of == null) {
      throw new RuntimeException(String.format("不支持的操作符[%s]", operator));
    }
    return of;
  }

  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入数字A:");
    String a = sc.nextLine();
    System.out.println("请选择运算符号(+、-):");
    String operator = sc.nextLine();
    OperationFactory of = createFactory(operator);
    Operation operation = of.createOperation();
    System.out.println("请输入数字B:");
    String b = sc.nextLine();
    operation.a = Double.parseDouble(a);
    operation.b = Double.parseDouble(b);
    System.out.println("计算结果:" + operation.getResult());
  }

工厂方法的优缺点:

3.抽象工厂

// 抽象产品:计算抽象类
  public static abstract class Operation {
    protected double a;
    protected double b;

    abstract double getResult();
  }

  // 具体产品:加法操作
  public static class OperationAdd extends Operation {
    @Override
    public double getResult() {
      return a + b;
    }
  }

  // 具体产品:减法操作
  public static class OperationSub extends Operation {
    @Override
    public double getResult() {
      return a - b;
    }
  }

  // 工厂方法
  public static abstract class OperationFactory {
    public abstract Operation createOperation();
  }

  public static class OperationFactoryAdd extends OperationFactory {
    @Override
    public Operation createOperation() {
      return new OperationAdd();
    }
  }


  public static class OperationFactorySub extends OperationFactory {
    @Override
    public Operation createOperation() {
      return new OperationSub();
    }
  }


  private static final Map<String, Class> switchMap = new HashMap<>();

  static {
    switchMap.put("+", OperationFactoryAdd.class);
    switchMap.put("-", OperationFactorySub.class);
  }

  public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入数字A:");
    String a = sc.nextLine();
    System.out.println("请选择运算符号(+、-):");
    String operator = sc.nextLine();
    OperationFactory of = (OperationFactory) switchMap.get(operator).newInstance();
    Operation operation = of.createOperation();
    System.out.println("请输入数字B:");
    String b = sc.nextLine();
    operation.a = Double.parseDouble(a);
    operation.b = Double.parseDouble(b);
    System.out.println("计算结果:" + operation.getResult());
  }

为创建一组相关或相互依赖的对象提供一个接口,而无需指定他们的具体类。
采用反射机制和Map集合去除繁重的switch操作。
抽象工厂的例子:Java jdbc驱动的实现

上一篇 下一篇

猜你喜欢

热点阅读