简单工厂模式与工厂方法模式

 

  • 简单工厂
    • 定义:简单工厂模式属于创建型模式,其又被称为静态工厂方法模式,这是由一个工厂对象决定创建出哪一种产品类的实例
    • 工厂类
      public class CamputerFactory {
      
          public static Computer createComputer1(String type) {
              Computer computer = null;
              switch (type){
                  case "Lenovo":
                      computer = new LenovoComputer();
                      break;
                  case "HP":
                      computer = new HPComputer();
                      break;
                      default:break;
              }
              return computer;
          }
      }
      
    • 客户端调用:
         @Test
          public void testSimpleFactory(){
              CamputerFactory.createComputer1("Lenovo").start();
          }
      
    • 抽象产品:
      public interface Computer {
          void start();
      }
      
    • 具体产品:
      public class HPComputer implements Computer {
      
          private static final String  TAG = "HPComputer";
      
          @Override
          public void start() {
              System.out.print(TAG+" work===========");
          }
      }
      
    • 使用场景:

      • 工厂类负责创建的对象比较少

      • 客户只需要知道传入工厂类的参数,而无需关心创建对象的逻辑。

      • 优点:使用户根据参数获得对应的类实例,避免了直接实例化类,降低了耦合性

      • 缺点:可实例化的类型在编译期间已经被确定。如果增加新类型,则需要修改工厂,这违背了开放封闭原则。简单工厂需要知道所有生成的类型 ,当其子类过多或者子类层次过多时不宜使用

  • 工厂方法
    • 定义:定义了一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。工厂方法使一个类的实例化延迟到子类
    • 有如下角色:
      • 抽象工厂类
      • 具体工厂类
      • 抽象产品类
      • 具体产品类
    • 抽象工厂类(使用abstract class也可以)
      public interface Factory <T extends Computer>{
          T createComputer(Class<T> clz);
      }
      
    • 具体工厂类:
      public class ConFactory implements Factory {
      
      
          @Override
          public Computer createComputer(Class clz) {
              Computer computer = null;
              String clzName = clz.getName();
              try {
                  Class clzz = Class.forName(clzName);
      
                  computer = (Computer) clzz.newInstance();
      
      
              } catch (Exception e) {
                  e.printStackTrace();
              }
              return computer;
          }
      }
      
    • 客户端调用:
       @Test
          public void testSimpleFactory(){
              ConFactory c = new ConFactory();
              c.createComputer(LenovoComputer.class).start();
          }
      

 

  • 简单工厂与工厂方法比较
    • 对于简单工厂模式,我们都知道其在工厂类中包含了必要的逻辑判断,根据不同的条件来动态实例化相关的类,对客户端来说,这去除了与具体产品的依赖;但与此同时也会带来一个问题:如果我们要增加产品,比如我们要生产苹果计算机,就需要在工厂类中添加一个case分支条件,这违背了开放封闭原则,对修改也开放了。
    • 而工厂方法模式就没有违背这个开放封闭原则。如果我们需要生产苹果计算机,就无需修改工厂类,直接创建产品即可

posted on 2018-06-04 10:00  endian11  阅读(186)  评论(0编辑  收藏  举报

导航