1. 开咖啡馆的启示:为什么要用创建型模式
想象你要开一家连锁咖啡店。中央厨房要生产浓缩咖啡、卡布奇诺和摩卡三种核心产品。如果让每个分店自行研发配方,不仅效率低下,品质也难以保障。更好的方式是总部制定标准配方(接口规范),分店按需生产具体饮品(实现类)。这正是创建型模式解决的问题——将对象创建逻辑与使用逻辑解耦,让系统更灵活可扩展。
2. 工厂方法模式:精品咖啡的手工调配台
2.1 模式定义与实现
定义一个创建对象的接口,但让子类决定实例化哪个类。如同咖啡师工作站:每个操作台(子类)都遵循标准冲泡流程(接口),但可选择不同的原料搭配。
// 技术栈:Java 11
// 咖啡产品接口
interface Coffee {
void prepare();
void brew();
}
// 具体产品类
class Espresso implements Coffee {
@Override public void prepare() { System.out.println("研磨18g深度烘焙咖啡豆"); }
@Override public void brew() { System.out.println("高压萃取28秒获得60ml浓缩咖啡"); }
}
// 抽象创建者
abstract class CoffeeStation {
public Coffee makeCoffee() {
Coffee coffee = createCoffee();
coffee.prepare();
coffee.brew();
return coffee;
}
// 工厂方法
abstract Coffee createCoffee();
}
// 具体创建者
class EspressoStation extends CoffeeStation {
@Override Coffee createCoffee() {
return new Espresso();
}
}
// 使用示例
public class FactoryMethodDemo {
public static void main(String[] args) {
CoffeeStation station = new EspressoStation();
Coffee coffee = station.makeCoffee();
}
}
2.2 典型应用场景
- 物流系统:不同运输方式(陆运/空运/海运)创建对应的物流策略
- 支付网关:支付宝、微信支付等不同支付渠道的创建
- 日志系统:根据环境(开发/生产)创建不同日志处理器
2.3 技术优劣分析
✓ 优点:符合开闭原则,新增产品类型时不影响已有代码
✗ 缺点:每新增一个产品就要创建对应的工厂类
3. 抽象工厂模式:咖啡机供应商的生态体系
3.1 模式内涵解析
提供一个创建一系列相关或依赖对象的接口,而无需指定它们具体的类。就像咖啡机供应商需要同时提供磨豆机、萃取器和奶泡器组成的整套设备。
// 设备组件接口
interface Grinder {
void grind(int weight);
}
interface Brewer {
void brew(int seconds);
}
// 商用设备系列
class CommercialGrinder implements Grinder {
@Override public void grind(int w) { System.out.println("商用级研磨"+w+"g咖啡豆"); }
}
class CommercialBrewer implements Brewer {
@Override public void brew(int s) { System.out.println("工业级萃取"+s+"秒"); }
}
// 家用设备系列
class HomeGrinder implements Grinder { /* 省略实现 */ }
class HomeBrewer implements Brewer { /* 省略实现 */ }
// 抽象工厂
interface EquipmentFactory {
Grinder createGrinder();
Brewer createBrewer();
}
// 具体工厂
class CommercialFactory implements EquipmentFactory {
@Override public Grinder createGrinder() { return new CommercialGrinder(); }
@Override public Brewer createBrewer() { return new CommercialBrewer(); }
}
// 客户端
class CoffeeShop {
private EquipmentFactory factory;
public CoffeeShop(EquipmentFactory f) {
this.factory = f;
}
public void setupEquipment() {
Grinder g = factory.createGrinder();
Brewer b = factory.createBrewer();
// 初始化设备逻辑...
}
}
3.2 应用场景示例
- 跨平台UI组件库:Windows/Mac风格的按钮、文本框组合
- 数据库访问套件:MySQL/Oracle的连接器、查询构建器组合
- 游戏装备套装:不同品质等级的武器、防具、饰品组合
3.3 模式特点剖析
✓ 保证产品兼容性
✗ 新增产品类型需修改工厂接口
4. 建造者模式:定制咖啡的精细流程
4.1 模式实现详解
将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。如同咖啡师定制饮料的分步操作。
// 技术栈:Java 11
class CustomCoffee {
private int espressoShots;
private int milkOz;
private boolean hasWhippedCream;
private String syrupType;
// 私有构造函数
private CustomCoffee(Builder builder) {
this.espressoShots = builder.shots;
this.milkOz = builder.milk;
this.hasWhippedCream = builder.whippedCream;
this.syrupType = builder.syrup;
}
// 建造者类
public static class Builder {
private int shots = 2;
private int milk = 0;
private boolean whippedCream = false;
private String syrup = "none";
public Builder shots(int s) {
this.shots = s;
return this;
}
public Builder milk(int ml) {
this.milk = ml;
return this;
}
public Builder addWhippedCream() {
this.whippedCream = true;
return this;
}
public Builder syrup(String type) {
this.syrup = type;
return this;
}
public CustomCoffee build() {
validate();
return new CustomCoffee(this);
}
private void validate() {
if (shots < 1 || shots > 4) {
throw new IllegalArgumentException("浓缩份数1-4份");
}
}
}
}
// 使用示例
public class BuilderDemo {
public static void main(String[] args) {
CustomCoffee coffee = new CustomCoffee.Builder()
.shots(3)
.milk(200)
.syrup("焦糖")
.addWhippedCream()
.build();
}
}
4.2 最佳实践场景
- HTTP请求构造器:设置请求头、参数、超时时间等
- 报表生成器:包含页眉、数据表格、统计图表、页脚的分步构建
- 游戏角色创建:逐步设置性别、职业、技能、装备等属性
4.3 模式优势对比
✓ 构建过程可精细化控制
✗ 增加了额外Builder类
5. 模式综合应用实战:星巴克订单系统设计
假设我们需要开发智能咖啡订单系统,整合三种模式:
- 抽象工厂:创建不同地区的原料供应链(亚洲豆/南美豆)
- 工厂方法:生产各类饮品(拿铁/美式/玛奇朵)
- 建造者:处理个性化定制(糖量、温度、配料)
这种组合使用实现了:
- 原料采购与产品生产的解耦
- 饮品类型的灵活扩展
- 客制化需求的便捷支持
6. 技术选型决策树
根据项目需求选择模式:
- 单一产品类型 ➔ 工厂方法
- 产品家族 ➔ 抽象工厂
- 复杂对象构建 ➔ 建造者
7. 实际应用注意事项
- 避免过度设计:简单对象直接使用new关键字
- 层次结构优化:结合Spring框架使用工厂模式
- 构建过程保护:建造者模式添加参数校验
- 文档配套:复杂构建流程需配备流程说明
8. 模式综合对比表
| 维度 | 工厂方法 | 抽象工厂 | 建造者模式 |
|---|---|---|---|
| 主要目的 | 单一产品创建 | 产品族创建 | 复杂对象构建 |
| 扩展方向 | 垂直扩展 | 横向扩展 | 参数组合扩展 |
| 适用场景 | 品类明确 | 兼容性要求高 | 构建流程复杂 |
| 系统复杂度 | 低 | 高 | 中等 |
9. 总结与展望
理解创建型模式的关键在于把握两个核心原则:
- 封装变化点:将易变的创建逻辑隔离
- 降低耦合度:使用者无需了解具体类信息
当系统需要处理多种对象创建场景时,三种模式经常组合使用。未来结合IoC容器、函数式编程等新技术,创建型模式将展现出更强大的生命力。
评论