> 文档中心 > 04-设计模式—抽象工厂模式

04-设计模式—抽象工厂模式


设计模式—抽象工厂模式

模式定义

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

Class Diagram

抽象工厂模式创建的是对象家族,也就是很多对象而不是一个对象,并且这些对象是相关的,也就是说必须一起创建出来。而工厂方法模式只是用于创建一个对象,这和抽象工厂模式有很大不同。

抽象工厂模式用到了工厂方法模式来创建单一对象,AbstractFactory 中的 createProductA() 和 createProductB() 方法都是让子类来实现,这两个方法单独来看就是在创建一个对象,这符合工厂方法模式的定义。

至于创建对象的家族这一概念是在 Client 体现,Client 要通过 AbstractFactory 同时调用两个方法来创建出两个对象,在这里这两个对象就有很大的相关性,Client 需要同时创建出这两个对象。

从高层次来看,抽象工厂使用了组合,即 Cilent 组合了 AbstractFactory,而工厂方法模式使用了继承。

04-设计模式—抽象工厂模式

应用场景

程序需要处理不同系列的相关产品(MySql与Oracle),但是您不希望它依赖这些产品的具体类时

优点

  1. 可以确信你从工厂得到的产品彼此是兼容
  2. 可以避免具体产品和客户端代码之间的紧密耦合
  3. 符合单一职责原则
  4. 符合开闭原则
/ * @program: DesignPatterns * @description: 抽象工厂模式 * @author: Coder_Pan * @create: 2022-04-13 09:10 /public class AbstractFactory {    public static void main(String[] args) { System.out.println("抽象工厂.....提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类"); System.out.println("______________________________________"); /  * 创建Mysql实例对象  */ IDataBaseUtils iDataBaseUtils = new MysqlDataBaseUtils(); //获取连接 IConnection connection = iDataBaseUtils.getConnection(); connection.connect(); //发送命令 ICommand command = iDataBaseUtils.getCommand(); command.command(); System.out.println("______________________________________"); /  * 创建Oracle实例对象  */ OracleDataBaseUtils oracleDataBaseUtils = new OracleDataBaseUtils(); //获取连接 IConnection oracleDataConnection = oracleDataBaseUtils.getConnection(); oracleDataConnection.connect(); //发送命令 ICommand oracleDataBaseUtilsCommand = oracleDataBaseUtils.getCommand(); oracleDataBaseUtilsCommand.command();    }}/   ==接口== * 模拟数据库连接池 */interface IConnection {    /     * 数据库连接     */    void connect();}/ * 模拟数据库操作 */interface ICommand {    /     * 数据库操作 = > 命令发送     */    void command();}/ * 基础接口 * * 将两个操作组合在一起 *  * 这就是一系列相关或互相依赖对象的接口 */interface IDataBaseUtils {    /     * 获取连接     * @return     */    IConnection getConnection();    /     * 发送命令     * @return     */    ICommand getCommand();}/  ==实现类== * 实现MySQL连接池 */class MySqlConnection implements IConnection {    @Override    public void connect() { System.out.println("实现MySQL连接池......");    }}/ * 实现Oracle连接池 */class OracleConnection implements IConnection {    @Override    public void connect() { System.out.println("实现Oracle连接池......");    }}/ * 实现Mysql命令 */class MySqlCommand implements ICommand {    @Override    public void command() { System.out.println("实现Mysql命令......");    }}/ * 实现Mysql命令 */class OracleCommand implements ICommand {    @Override    public void command() { System.out.println("实现Oracle命令......");    }}/ * Mysql实例创建 */class MysqlDataBaseUtils implements IDataBaseUtils {    @Override    public IConnection getConnection() { return new MySqlConnection();    }    @Override    public ICommand getCommand() { return new MySqlCommand();    }}/ * Oracle实例创建 */class OracleDataBaseUtils implements IDataBaseUtils {    @Override    public IConnection getConnection() { return new OracleConnection();    }    @Override    public ICommand getCommand() { return new OracleCommand();    }}
  • JDK
    • javax.xml.parsers.DocumentBuilderFactory
    • javax.xml.transform.TransformerFactory
    • javax.xml.xpath.XPathFactory