设计模式之抽象工厂模式
定义
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
结构

- 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 就是具体产品工厂和具体产品。
总结
优点
- 隔离接口和实现,很容易增加新的产品簇。
缺点
- 增加新的产品类型很麻烦,需要修改原有系统,甚至需要修改抽象层代码,从这个角度看,违背了开闭原则。
- 类层次容易变复杂。
本质
抽象工厂模式的本质就是选择产品簇的实现,如果只有一种产品就会退化成工厂方法模式。
使用场景
- 产品的创建和使用需要解耦,有多于一个的产品簇,并且产品类型稳定,不会轻易修改,这种情况下可以使用抽象工厂模式。
参考
大战设计模式【6】—— 抽象工厂模式
大战设计模式(第二季)【1】———— 从源码看工厂模式
设计模式的征途—4.抽象工厂(Abstract Factory)模式
研磨设计模式-书籍
 
         
         
         
         
         
        
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号