23天读懂23种设计模式:抽象工厂设计模式(创建型)

点击上方 蓝字 关注我们

创建型模式是用来创建对象的模式,抽象了实例化的过程,帮助一个系统独立于其他关联对象的创建、组合和表示方式。

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

winter

抽象工厂模式也是创建型的设计模式之一,本文是设计模式系列(共24节)的第6篇文章。

设计模式都从六大原则出发进行总结:《第一节:设计模式的六大原则

创建型设计模式共5种:

抽象工厂设计模式是什么?

工厂方法模式是通过一个工厂类完成产品的统一构造;抽象工厂模式则是对工厂方法的拓展。

通过抽象工厂我们可以实现:在运行时切换工厂,以允许在不同的上下文中使用不同的工厂。

抽象工厂设计模式的应用

下面我们复习下抽象工厂设计模式的应用示例。

举例子1:我们使用抽象工厂设计模式解决一个问题:Linux系统和Windows系统,不同的系统具备自己文件管理的能力,并且能够创建不同的文件夹。

首先,定义了我们的模板类:文件夹

public interface Folder {
  String getPath();
}
public class LinuxFolder implements Folder{
  private String path = "/usr/bin";
  public String getPath() {
    return this.path;
  }
}
public class WindowFolder implements Folder{
  private String path = "/C:/file";
  public String getPath() {
    return this.path;
  }
‍‍‍‍‍‍‍‍‍‍‍‍‍‍}

然后,定义我们的工厂类:

public interface FolderFactory {
  Folder createFolder();
}
public class LinuxSystemFolderFactory implements FolderFactory{
  @Override
  public Folder createFolder() {
    return new LinuxFolder();
  }
}
public class WindowsSystemFolderFactory implements FolderFactory{
  @Override
  public Folder createFolder() {
    return new WindowFolder();
  }
}

最后,我们定义抽象工厂:

public interface SystemFolderFactoryCreator {
  WindowsSystemFolderFactory getWindowsFolderFactory();
  LinuxSystemFolderFactory getLinuxFolderFactory();
}
/**
 * <p>
 *     抽象工厂类
 * </p>
 */


public class FolderFactoryCreator implements SystemFolderFactoryCreator {
  @Override
  public WindowsSystemFolderFactory getWindowsFolderFactory() {
    return new WindowsSystemFolderFactory();
  }


  @Override
  public LinuxSystemFolderFactory getLinuxFolderFactory() {
    return new LinuxSystemFolderFactory();
  }
}

UML结构图:

抽象工厂设计模式的优缺点

抽象工厂模式的优点:

  • 封装性:调用产品类对象的高层模块不用关心对象是如何创建出来的,因为创建对象的工作,由工厂类完成了。

  • 产品族内的约束为非公开状态。

抽象工厂模式的缺点:

  • 难以扩展,以上面为例,如果我们需要黑莓系统的文件夹,那么需要在抽象工厂接口 SystemFolderFactoryCreator 添加一个新的方法实现,这其实违反了开闭原则。

抽象工厂设计模式在JDK源码的应用

我们可以查看jdbc源码的 Connection 接口,它提供了几个抽象方法,这些方法最终会返回另一个“工厂”对象。

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

比如,createStatement() 方法最终生产了一个工厂对象 Statement,我们看下源码,这里的 Statement 最终也有具体生产结果集对象的工厂方法。

public interface Statement extends Wrapper, AutoCloseable {
    ResultSet executeQuery(String sql) throws SQLException;
}

总结

抽象工厂的意思其实就是对工厂的抽象,说的直白一点,就是工厂的工厂:工厂模式生成对象,抽象工厂生成工厂。

到此,我们对创建型设计模式的总结已经完成了(单例&工厂方法&抽象工厂&建造者&原型),后续我们在一起讨论“结构型”设计模式的应用。

往期推荐

《源码系列》

JDK之Object 类

JDK之BigDecimal 类

JDK之String 类

JDK之Lambda表达式

《经典书籍》

Java并发编程实战:第1章 多线程安全性与风险

Java并发编程实战:第2章 影响线程安全性的原子性和加锁机制

Java并发编程实战:第3章 助于线程安全的三剑客:final & volatile & 线程封闭

《服务端技术栈》

《Docker 核心设计理念

《Kafka史上最强原理总结》

《HTTP的前世今生》

《算法系列》

读懂排序算法(一):冒泡&直接插入&选择比较

《读懂排序算法(二):希尔排序算法》

《读懂排序算法(三):堆排序算法》

《读懂排序算法(四):归并算法》

《读懂排序算法(五):快速排序算法》

读懂排序算法(六):二分查找算法

《设计模式》

设计模式之六大设计原则

设计模式之创建型(1):单例模式

设计模式之创建型(2):工厂方法模式

设计模式之创建型(3):原型模式

设计模式之创建型(4):建造者模式

扫描二维码

获取技术干货

后台技术汇

点个“在看”表示朕

已阅

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值