创建型模式究竟解决了什么问题
创建型模式(Creational Patterns)的核心目标是解耦对象的创建过程,解决与对象实例化相关的复杂性问题。它们通过不同的方式控制对象的创建,以应对以下常见问题:
创建型模式解决的六大核心问题
1. 避免硬编码具体类
• 问题:代码中直接new
具体类(如Car car = new BMW()
),导致依赖具体实现,难以扩展。
• 解决:
◦ 工厂方法:通过子类决定实例化哪个类。
◦ 抽象工厂:提供创建相关对象的接口,隐藏具体类。
java // 工厂方法:通过子类决定创建哪种车 abstract class CarFactory { abstract Car createCar(); } class BMWFactory extends CarFactory { Car createCar() { return new BMW(); } }
2. 复杂对象的构造过程
• 问题:对象构造需要多步操作(如组装电脑需设置CPU、内存、硬盘等),直接构造代码臃肿。
• 解决:
◦ 建造者模式:分步骤构建对象,统一构造流程。
java Computer computer = new ComputerBuilder() .setCPU("i7").setRAM("16GB").setSSD("512GB") .build();
3. 对象创建的资源消耗
• 问题:某些对象创建成本高(如数据库连接、复杂配置初始化)。
• 解决:
◦ 原型模式:通过克隆(clone()
)复用已有对象,避免重复初始化。
◦ 单例模式:全局共享一个实例,减少资源占用。
java DatabaseConnection connection = originalConnection.clone();
4. 对象创建的灵活性
• 问题:需要动态支持不同类或配置的实例化(如插件系统、多环境配置)。
• 解决:
◦ 抽象工厂:切换整个产品族(如从“Windows风格”切换到“Mac风格”)。
◦ 工厂方法:运行时决定创建哪种子类对象。
5. 对象创建的约束
• 问题:需要控制实例数量或访问(如线程池、连接池限制最大实例数)。
• 解决:
◦ 单例模式:确保全局唯一实例。
◦ 对象池模式(非GoF,但常用):复用有限数量的对象实例。
6. 对象创建的依赖解耦
• 问题:客户端代码需要知道具体类才能创建对象,导致高耦合。
• 解决:
◦ 依赖注入(DI):通过外部容器(如Spring)管理对象创建和依赖关系。
◦ 工厂模式:将创建逻辑封装在工厂中,客户端仅依赖接口。
创建型模式对比
模式 | 解决的问题 | 典型场景 | 关键区别 |
---|---|---|---|
工厂方法 | 需要子类决定实例化哪个类 | 跨平台UI组件(如按钮、对话框) | 单一产品,延迟到子类实例化 |
抽象工厂 | 创建一组相关对象(产品族) | 跨风格GUI库(如Windows/Mac控件库) | 产品族,强调组合的兼容性 |
建造者 | 分步骤构造复杂对象 | 组装电脑、生成SQL查询 | 分步构建,灵活配置部件 |
原型 | 避免重复初始化成本高的对象 | 游戏中的敌人克隆、配置模板复制 | 通过克隆复用已有对象 |
单例 | 控制实例数量,全局访问点 | 数据库连接池、日志系统 | 唯一实例,严格访问控制 |
总结:创建型模式是软件设计中“如何优雅地new对象”的答案,让系统更灵活、可维护。