简单工厂模式

简介

  • 所谓工厂模式就是用工厂方法代替new方法来产生所需要的对象。而简单工厂模式则是是由一个工厂对象决定创建出哪一种类型的对象。
  • 一般来说,简单工厂模式有三个组成部分:
    • 工厂类:简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
    • 抽象产品类:简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
    • 具体产品类:是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。

实例

  • 首先给出本Demo 的UML图。
    简单工厂模式UML图.png
    • Operation 类:也就是上面提到的抽象产品类,拥有公共方法getResult()。
    • AddOperation等类:具体产品类,根据自身的特性实现了Operation的抽象方法。
    • OperationFactory类:工厂类,通过该类获得各产品类的实例。
  • 具体实现如下:
    Operation:
    public abstract class Operation {
    
        abstract double getResult(double a, double b) throws Exception;
    
    }
    
    AddOperation:
    public class AddOperation extends Operation {
    
      @Override
      double getResult(double a, double b) {
          return a + b;
      }
    }
    
    MulOperation:
    public class MulOperation extends Operation {
      @Override
      double getResult(double a, double b) {
          return a * b;
      }
    }
    
    SubOperation:
    public class SubOperation extends Operation {
      @Override
      double getResult(double a, double b) {
          return a - b;
      }
    }
    
    DivOperation:
    public class DivOperation extends Operation {
      @Override
      double getResult(double a, double b) throws Exception {
          if (b == 0) {
              throw new Exception("除数不能为0");
          } else {
              return a/b;
          }
      }
    }
    
    OperationFactory:
    public class OperationFactory {
    
      public static Operation getOperation(String operation) {
          Operation oper = null;
          switch (operation) {
              case "+":
                  oper =  new AddOperation();
                  break;
              case "-":
                  oper =  new SubOperation();
                  break;
              case "*":
                  oper = new MulOperation();
                  break;
              case "/":
                  oper = new DivOperation();
                  break;
          }
          return oper;
      }
    
    }
    
    测试类Calculator:
    public class Calculator {
    
      public static void main(String args[]) {
          double a = 1.0;
          double b = 2.0;
          Operation oper = OperationFactory.getOperation("+");
          try {
              double result =  oper.getResult(a,b);
              System.out.print("结果是:" + result);
          } catch (Exception e) {
              System.out.print("除数不能为0");
          }
      }
    
    }
    
    运行结果:
    结果是:3.0
    Process finished with exit code 0
    

优缺点

  • 优点:将选择生成具体的产品代码封装在工厂类中,外界只需要提供相应的信息就能得到所需要的产品实例而不必考虑实现的细节,一定程度提高了程序的扩展性和维护性。
  • 缺点:每次增加具体的产品类都需要改动工厂类,具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容