赞
踩
抽象工厂模式(Abstract Factory Pattern)是所有形式的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式又称为Kit模式,属于对象创建型模式。在抽象工厂模式中,引入了产品等级结构和产品族的概念,产品等级结构是指抽象产品与具体产品所构成的继承层次关系,产品族(Product Family)是同一个工厂所生产的一系列产品,即位于不同产品等级结构且功能相关联的产品组成的家族。
抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。
定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。
使用频率:5星
抽象工厂模式结构图:
模式结构:
抽象工厂模式同工厂方法模式一样,也是由抽象工厂、具体工厂、抽象产品和具体产品等 4 个要素构成,但抽象工厂中方法个数不同,抽象产品的个数也不同。
抽象工厂模式的主要角色如下:
1、抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品。
2、具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
3、抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
4、具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系。
应用场景:
1、当需要创建的对象是一系列相互关联或相互依赖的产品族时,如电器工厂中的电视机、洗衣机、空调等。
2、系统中有多个产品族,但每次只使用其中的某一族产品。如有人只喜欢穿某一个品牌的衣服和鞋。
3、系统中提供了产品的类库,且所有产品的接口相同,客户端不依赖产品实例的创建细节和内部结构。
某系统为了改进数据库操作的性能,自定义数据库连接对象Connection和语句对象Statement,可针对不同类型的数据库提供不同的连接对象和语句对象,如提供Oracle或MySQL专用连接类和语句类,而且用户可以通过配置文件等方式根据实际需要动态更换系统数据库。使用抽象工厂模式设计系统。
本例中,DBF接口充当抽象工厂,其子类OracleFactory和MySQLFactory充当具体工厂,Connection和Statement接口充当抽象产品,其子类OracleConnection、MySQLConnection、OracleStatement和MySQLStatement充当具体产品。本实例代码如下:
//数据库连接接口:抽象产品 interface Connection { public void connect(); } //Oracle数据库连接类:具体产品 class OracleConnection implements Connection { public void connect() { System.out.println("连接Oracle数据库"); } } //MySQL数据库连接类:具体产品 class MySQLConnection implements Connection { public void connect() { System.out.println("连接MySQL数据库"); } } / //数据库语句接口:抽象产品 interface Statement { public void executeStatement(); } //Oracle数据库语句类:具体产品 class OracleStatement implements Statement { public void executeStatement() { System.out.println("执行Oracle数据库语句"); } } //MySQL数据库连接类:具体产品 class MySQLStatement implements Statement { public void executeStatement() { System.out.println("执行MySQL数据库语句"); } } / //数据库工厂接口:抽象工厂 interface DBFactory { public Connection createConnection(); public Statement createStatement(); } //Oracle数据库工厂:具体工厂 class OracleFactory implements DBFactory { public Connection createConnection() { return new OracleConnection(); } public Statement createStatement(); { return new OracleStatement(); } } //MySQL数据库工厂:具体工厂 class MySQLFactory implements DBFactory { public Connection createConnection() { return new MySQLConnection(); } public Statement createStatement(); { return new MySQLStatement(); } }
客户端测试类代码如下:
class Client
{
public static void main(String[] args)
{
DBFactory factory;
Connection connection;
Statement statement;
factory = new OracleFactory();
connection = factory.createConnection();
statement = factory.createStatement();
connection.connect();
statement.executeStatement();
}
}
运行结果如下:
连接Oracle数据库
执行Oracle数据库语句
总结部分大多与工厂模式差不多,但是区别在于如果增加新的产品等级结构,每个工厂要生产一个新的类型的对象,则需要修改抽象工厂接口和所有具体工厂类,从这个角度看,抽象工厂模式违背了开闭原则,因此在使用抽象工厂模式时需要仔细分析所有的产品结构,避免再设计完成之后修改源代码,特别是抽象层代码。
【1】抽象工厂模式(详解版)
【2】设计模式实训教程(第2版) 刘伟 编著 清华大学出版社
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。