04-设计模式—抽象工厂模式
设计模式—抽象工厂模式
模式定义:
提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类
Class Diagram
抽象工厂模式创建的是对象家族,也就是很多对象而不是一个对象,并且这些对象是相关的,也就是说必须一起创建出来。而工厂方法模式只是用于创建一个对象,这和抽象工厂模式有很大不同。
抽象工厂模式用到了工厂方法模式来创建单一对象,AbstractFactory 中的 createProductA() 和 createProductB() 方法都是让子类来实现,这两个方法单独来看就是在创建一个对象,这符合工厂方法模式的定义。
至于创建对象的家族这一概念是在 Client 体现,Client 要通过 AbstractFactory 同时调用两个方法来创建出两个对象,在这里这两个对象就有很大的相关性,Client 需要同时创建出这两个对象。
从高层次来看,抽象工厂使用了组合,即 Cilent 组合了 AbstractFactory,而工厂方法模式使用了继承。
应用场景:
程序需要处理不同系列的相关产品(MySql与Oracle),但是您不希望它依赖这些产品的具体类时
优点:
- 可以确信你从工厂得到的产品彼此是兼容的
- 可以避免具体产品和客户端代码之间的紧密耦合
- 符合单一职责原则
- 符合开闭原则
/ * @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