Java设计模式设计模式

《设计模式》简单工厂模式

2019-08-08  本文已影响1人  敏捷Studio

定义

定义一个用于创建对象的接口,让子类决定实例化哪个类。

介绍

UML类图

简单工厂模式UML类图

角色说明:

实现

1、创建抽象产品类,定义公共接口:

// 抽象产品类 
public abstract class Product {
  public abstract void show();
}

2、创建具体产品类,继承Product类:

// 具体产品类A 
public class ProductA extends Product {
  @Override
  public void show() {
    System.out.println("product A");
  }
}
// 具体产品类B
public class ProductB extends Product {
  @Override
  public void show() {
    System.out.println("product B");
  }
}

3、创建工厂类,创建具体的产品:

public class Factory {
  public static Product create(String productName) {
    Product product = null;
    // 通过switch语句控制生产哪种商品
    switch (productName) {
      case "A":
        product = new ProductA();
        break;
      case "B":
        product = new ProductB();
        break;
    }
    return product;
  }
}

4、测试方法:

public void test() {
  // 生产ProductA
  Factory.create("A").show();
  // 生产ProductB
  Factory.create("B").show();
  try {
    // 生产ProductC
    Factory.create("C").show();
  } catch (NullPointerException e) {
    System.out.println("没有ProductC");
  }
}

应用场景

生成复杂对象时,确定只有一个工厂类,可以使用简单工厂模式。否则有多个工厂类的话,使用工厂方法模式

优缺点

优点

缺点

简单工厂进化

1、工厂方法模式 VS 简单工厂模式

2、简单工厂模式的优化(反射实现)
由于简单工厂模式新增产品时需要直接修改工厂类,违反了开放封闭原则。因此可以使用反射来创建实例对象,确保能够遵循开放封闭原则

public class Factory {
  public static <T extends Product> T create(Class<T> clz) {
    Product product = null;
    try {
      // 反射出实例
      product = (Product) Class.forName(clz.getName()).newInstance();
    } catch (Exception e) {
       e.printStackTrace();
    }
    return (T) product;
  }
}

测试方法

public void test() {
  // 生产ProductA
  Factory.create(ProductA.class).show();
  // 生产ProductB
  Factory.create(ProductB.class).show();
}

3、 总结
使用反射来实现工厂类,新增产品时无需修改工厂类,但是使用反射来创建实例对象的话会比正常使用new来创建的要慢。

上一篇 下一篇

猜你喜欢

热点阅读