创建型模式是用来创建对象的模式,抽象了实例化的过程,帮助一个系统独立于其他关联对象的创建、组合和表示方式。
抽象工厂模式的目的:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
winter
抽象工厂模式也是创建型的设计模式之一,本文是设计模式系列(共24节)的第6篇文章。
设计模式都从六大原则出发进行总结:《第一节:设计模式的六大原则》
创建型设计模式共5种:
- 单例模式(Singleton Pattern):一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
- 工厂方法模式(Factory Pattern):在工厂方法模式中,工厂类成为了抽象类,实际的创建工作将由其具体子类来完成。
- 抽象工厂模式(Abstract Factory):抽象工厂可以向客户提供一个接口,创建多个产品族中的产品对象,强调的是“对象系列”的变化。
- 建造者模式(Builder Pattern):把构造对象实例的逻辑移到了类的内部,在类的外部定义了该类的构造逻辑,强调的是产品的构造过程。
- 原型模式(Prototype Pattern):原型模式和工厂模式一样,同样对客户隐藏了对象创建工作具体的实现细节,通过复制一个现有的对象生成新对象。
抽象工厂设计模式是什么?
工厂方法模式是通过一个工厂类完成产品的统一构造;抽象工厂模式则是对工厂方法的拓展。
通过抽象工厂我们可以实现:在运行时切换工厂,以允许在不同的上下文中使用不同的工厂。
抽象工厂设计模式的应用
下面我们复习下抽象工厂设计模式的应用示例。
举例子1:我们使用抽象工厂设计模式解决一个问题:Linux系统和Windows系统,不同的系统具备自己文件管理的能力,并且能够创建不同的文件夹。
首先,定义了我们的模板类:文件夹
代码语言:javascript复制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;
}
}
然后,定义我们的工厂类:
代码语言:javascript复制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();
}
}
最后,我们定义抽象工厂:
代码语言:javascript复制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 接口,它提供了几个抽象方法,这些方法最终会返回另一个“工厂”对象。
代码语言:javascript复制public interface Connection {
//提供一个执行对象
Statement createStatement() throws SQLException;
//提供一个支持预编译的执行对象
PreparedStatement prepareStatement(String sql) throws SQLException;
//提供一个支持存储过程的执行对象
CallableStatement prepareCall(String sql) throws SQLException;
}
比如,createStatement() 方法最终生产了一个工厂对象 Statement,我们看下源码,这里的 Statement 最终也有具体生产结果集对象的工厂方法。
代码语言:javascript复制public interface Statement extends Wrapper, AutoCloseable {
ResultSet executeQuery(String sql) throws SQLException;
}
总结
抽象工厂的意思其实就是对工厂的抽象,说的直白一点,就是工厂的工厂:工厂模式生成对象,抽象工厂生成工厂。
到此,我们对创建型设计模式的总结已经完成了(单例&工厂方法&抽象工厂&建造者&原型),后续我们在一起讨论“结构型”设计模式的应用。