设计模式(三)工厂模式

84 阅读2分钟

工厂模式分为工厂方法模式和抽象工厂模式两类

一、工厂方法模式

1、定义

为创建一组相关的对象提供一个接口,无需制定他们的具体类

2、类图

image.png

  • 抽象工厂: 定义接口,提供创建产品的方法

  • 具体工厂:实现具体的创建逻辑

  • 抽象产品: 定义接口,提供产品相关方法

  • 具体产品,最终所创建的具体产品的对象

3、实例

(1)抽象工厂

/**
 * @Description 抽象工厂
 */
public abstract class Factory {
  /**
   * 用来创建产品
   * @param <T>
   * @return
   */
  public abstract  <T extends Product> T createProduct(Class<T> tClass);
}

(2)具体工厂

public class ConcreteFactory extends Factory {
  /**
   * 通过反射创建不同对象
   * @param tClass
   * @param <T>
   * @return
   */
  public  <T extends Product>  T createProduct(Class<T> tClass) {
    Product product = null;
    try {
      product = (Product) Class.forName(tClass.getName()).newInstance();
    } catch (Exception e) {
      e.printStackTrace();
    }
    return (T) product;
  }
}

(3)抽象产品

/**
 * @Description 抽象产品
 */
public abstract class Product {
  /**
   * 由具体的产品实现
   */
  public abstract void method();
}

(4)具体产品

public class ProductA extends Product {
  @Override
  public void method() {
    System.out.print("A产品");
  }
}

(5)创建

public class FactoryTest {
  public static void main(String[] args) {
    Factory factory = new ConcreteFactory();
    ProductA productA = factory.createProduct(ProductA.class);
    productA.method();
  }
}

4、优点

  • 结构清晰、易于拓展(添加新类型简单)

  • 屏蔽产品类,只关注产品的创建

5、应用场景

用于需要创建对象,并且需要,需要考虑是否有必要增加工厂类进行对象创建

6、工厂方法模式拓展

1、将工厂抽象类和实现类简化为静态方法

public static  <T extends Product>  T createProduct(Class<T> tClass) {
  Product product = null;
  try {
    product = (Product) Class.forName(tClass.getName()).newInstance();
  } catch (Exception e) {
    e.printStackTrace();
  }
  return (T) product;
}

2、提供多个工厂实现类用于创建不同的产品

二、抽象工厂模式

1、定义

为创建一组相关或相互依赖的对象提供一个接口,而不需要指定他们具体类

2、类图

image.png

  • AbstractFactory:抽象工厂,声明一组用于创建产品的方法,每个方法对应一种产品

  • ConcreteFactory:具体工厂,实现了抽象工厂中创建产品的方法

  • AbstractProduct:抽象产品角色,为每种产品声明接口

  • ConcreteProduct:具体产品角色,定义具体产品对象

3、实例

(1)抽象工厂

/**
 * @Description 抽象工厂
 */
public abstract class Factory {
  /**
   * 用来创建产品
   * @return
   */
  public abstract ProductA createProductA();

  public abstract ProductB createProductB();
}

(2)具体工厂

public class ConcreteFactory extends Factory {
  @Override
  public ProductA createProductA() {
    return new ProductA();
  }

  @Override
  public ProductB createProductB() {
    return new ProductB();
  }
}

(3)抽象产品

/**
 * @Description 抽象产品
 */
public abstract class Product {
  /**
   * 由具体的产品实现
   */
  public abstract void method();
}

(4)具体产品

public class ProductA extends Product {
  @Override
  public void method() {
    System.out.print("A产品");
  }
}
public class ProductB extends Product {
  @Override
  public void method() {
    System.out.print("B产品");
  }
}

4、优缺点

  • 接口和实现的分离,实现解耦

  • 拓展不方便,每次新增产品类,都需要修改工厂类,违反了开闭原则

三、两者对比

1、工厂方法模式:一个工厂生产一种产品

2、抽象工厂模式:一个工厂可以生产多种产品

汇总:设计模式总结