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(); } }
posted on 2022-04-13 09:43 JavaCoderPan 阅读(13) 评论(0) 编辑 收藏 举报 来源
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南