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. 模式综合应用实战:星巴克订单系统设计

假设我们需要开发智能咖啡订单系统,整合三种模式:

  1. 抽象工厂:创建不同地区的原料供应链(亚洲豆/南美豆)
  2. 工厂方法:生产各类饮品(拿铁/美式/玛奇朵)
  3. 建造者:处理个性化定制(糖量、温度、配料)

这种组合使用实现了:

  • 原料采购与产品生产的解耦
  • 饮品类型的灵活扩展
  • 客制化需求的便捷支持

6. 技术选型决策树

根据项目需求选择模式:

  • 单一产品类型 ➔ 工厂方法
  • 产品家族 ➔ 抽象工厂
  • 复杂对象构建 ➔ 建造者

7. 实际应用注意事项

  1. 避免过度设计:简单对象直接使用new关键字
  2. 层次结构优化:结合Spring框架使用工厂模式
  3. 构建过程保护:建造者模式添加参数校验
  4. 文档配套:复杂构建流程需配备流程说明

8. 模式综合对比表

维度 工厂方法 抽象工厂 建造者模式
主要目的 单一产品创建 产品族创建 复杂对象构建
扩展方向 垂直扩展 横向扩展 参数组合扩展
适用场景 品类明确 兼容性要求高 构建流程复杂
系统复杂度 中等

9. 总结与展望

理解创建型模式的关键在于把握两个核心原则:

  1. 封装变化点:将易变的创建逻辑隔离
  2. 降低耦合度:使用者无需了解具体类信息

当系统需要处理多种对象创建场景时,三种模式经常组合使用。未来结合IoC容器、函数式编程等新技术,创建型模式将展现出更强大的生命力。