大话设计模式-工厂模式

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驱动的实现

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 设计模式概述 在学习面向对象七大设计原则时需要注意以下几点:a) 高内聚、低耦合和单一职能的“冲突”实际上,这两者...
    彦帧阅读 3,772评论 0 14
  • 设计模式基本原则 开放-封闭原则(OCP),是说软件实体(类、模块、函数等等)应该可以拓展,但是不可修改。开-闭原...
    西山薄凉阅读 3,856评论 3 14
  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 3,961评论 1 15
  • 十八岁的那年插队去了农村,初见房东是在她屋前的水井边,只见一位大娘满头白发,满脸褶子,土布的斜襟衫略显出丰满...
    飘然A阅读 1,922评论 9 17
  • #v课会·第4季-30天思维训练实战营# 打卡人:小朋友 打卡天数:13/30 打卡时间:2018.11.06 打...
    小朋友CRw13阅读 249评论 0 0