atwood-pan

 

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

设计模式—抽象工厂模式

模式定义

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

Class Diagram

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

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

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

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

Luh5xH.png

应用场景

程序需要处理不同系列的相关产品(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();
    }
}

posted on 2022-04-13 09:43  JavaCoderPan  阅读(13)  评论(0编辑  收藏  举报  来源

导航