设计模式之抽象工厂模式

定义

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

结构

  • ProductFactory,抽象产品工厂,声明了一组创建一簇产品的工厂方法,每一个方法对应一种产品。
  • MobileProduct,ComputerProduct,抽象产品,工厂方法返回的接口类型。
  • HuaweiProductFactory,SamsungProductFactory,具体工厂,实现抽象工厂接口,工厂方法返回一簇具体产品。
  • HuaweiMobileProduct,HuaweiComputerProduct,具体产品,抽象产品的实现。

简单实现

两种抽象产品

/**
 * 手机产品
 */
public interface MobileProduct {

  void show();

}
/**
 * 电脑产品
 */
public interface ComputerProduct {

  void show();

}

抽象工厂

public interface ProductFactory {

  /**
   * 创建手机产品
   */
  MobileProduct createMobileProduct();

  /**
   * 创建电脑产品
   */
  ComputerProduct createComputerProduct();
}

具体工厂和具体产品

/**
 * 华为产品工厂
 */
public class HuaweiProductFactory implements ProductFactory {

  @Override
  public MobileProduct createMobileProduct() {
    return new HuaweiMobileProduct();
  }

  @Override
  public ComputerProduct createComputerProduct() {
    return new HuaweiComputerProduct();
  }

  public static class HuaweiMobileProduct implements MobileProduct {

    @Override
    public void show() {
      System.out.println("HuaweiMobileProduct show");
    }
  }

  public static class HuaweiComputerProduct implements ComputerProduct {

    @Override
    public void show() {
      System.out.println("HuaweiComputerProduct show");
    }
  }
}

第二个具体工厂实现

/**
 * 三星产品工厂
 */
public class SamsungProductFactory implements ProductFactory {

  @Override
  public MobileProduct createMobileProduct() {
    return new SamsungMobileProduct();
  }

  @Override
  public ComputerProduct createComputerProduct() {
    return new SamsungComputerProduct();
  }

  public static class SamsungMobileProduct implements MobileProduct {

    @Override
    public void show() {
      System.out.println("SamsungMobileProduct show");
    }
  }

  public static class SamsungComputerProduct implements ComputerProduct {

    @Override
    public void show() {
      System.out.println("SamsungComputerProduct show");
    }
  }
}

客户端

public class Client {

  public static void main(String[] args) {
    ProductFactory productFactory = new SamsungProductFactory();
    productFactory.createMobileProduct().show();
    productFactory.createComputerProduct().show();
  }

}

定义两组产品,华为和三星,每组都有自己的手机产品和电脑产品。

抽象工厂模式在JDK中的实现

JDK中操作数据库的接口 Connection

public interface Connection {
    //创建一个执行对象
    Statement createStatement() throws SQLException;
    //创建一个支持预编译的执行对象
    PreparedStatement prepareStatement(String sql) throws SQLException;
    //创建一个支持存储过程的执行对象
    CallableStatement prepareCall(String sql) throws SQLException;
}

Connection 就是抽象工厂,Statement,PreparedStatement,CallableStatement 就是抽象产品,各种数据库实现如 MySQL 和 SQLServer 就是具体产品工厂和具体产品。

总结

优点

  1. 隔离接口和实现,很容易增加新的产品簇。

缺点

  1. 增加新的产品类型很麻烦,需要修改原有系统,甚至需要修改抽象层代码,从这个角度看,违背了开闭原则。
  2. 类层次容易变复杂。

本质

抽象工厂模式的本质就是选择产品簇的实现,如果只有一种产品就会退化成工厂方法模式。

使用场景

  1. 产品的创建和使用需要解耦,有多于一个的产品簇,并且产品类型稳定,不会轻易修改,这种情况下可以使用抽象工厂模式。

参考

大战设计模式【6】—— 抽象工厂模式
大战设计模式(第二季)【1】———— 从源码看工厂模式
设计模式的征途—4.抽象工厂(Abstract Factory)模式
研磨设计模式-书籍

posted @ 2021-08-10 20:55  strongmore  阅读(65)  评论(0编辑  收藏  举报