生成器模式(建造者模式)
把复杂对象的建造过程和表示分离,让同样的建造过程可以创建不同的表示。
假设你去快餐店买汉堡,汉堡由面包、肉饼、蔬菜、酱料等部分组成。
建造者模式的角色类比:
- 产品(Product):汉堡
(由多个部分组成的复杂对象) - 抽象建造者(Builder):汉堡建造接口
(定义 “放面包”“放肉饼”“放蔬菜”“放酱料” 等建造步骤) - 具体建造者(ConcreteBuilder):鸡肉堡建造者、牛肉堡建造者
(分别实现不同汉堡的建造步骤,比如鸡肉堡放鸡腿肉,牛肉堡放牛肉饼) - 指挥者(Director):服务员
(告诉建造者 “先放面包→再放肉饼→加蔬菜→加酱料”,控制建造顺序)
为什么要用建造者模式?
- 场景对比:
- 不用模式时: 直接 new 一个汉堡对象,要一次性传所有参数(面包类型、肉饼种类、蔬菜数量…),代码又长又容易错。
- 用建造者模式: 像 “组装乐高” 一样,一步步造汉堡,每个步骤独立,最后由指挥者按顺序组装。
核心优势
- 解耦建造过程和产品表示:比如造 “豪华汉堡” 和 “普通汉堡”,可以复用相同的建造流程,只修改部分步骤。
- 简化复杂对象创建:避免 “巨量参数构造函数”,代码更清晰。
- 方便扩展新产品:新增 “素食汉堡” 时,只需新建一个建造者,不修改原有逻辑。
代码示例
// 1. 产品:汉堡
class Hamburger {
private String bread;
private String meat;
private String veggies;
private String sauce;
// 省略getter/setter,用Builder模式时很少直接操作这些字段
}
// 2. 抽象建造者:定义建造步骤
interface HamburgerBuilder {
void buildBread();
void buildMeat();
void buildVeggies();
void buildSauce();
Hamburger getHamburger();
}
// 3. 具体建造者:鸡肉堡建造者
class ChickenBurgerBuilder implements HamburgerBuilder {
private Hamburger hamburger = new Hamburger();
@Override
public void buildBread() { hamburger.setBread("芝麻面包"); }
@Override
public void buildMeat() { hamburger.setMeat("炸鸡腿肉"); }
@Override
public void buildVeggies() { hamburger.setVeggies("生菜+番茄"); }
@Override
public void buildSauce() { hamburger.setSauce("番茄酱"); }
@Override
public Hamburger getHamburger() { return hamburger; }
}
// 4. 指挥者:服务员,控制建造顺序
class Waiter {
private HamburgerBuilder builder;
public Waiter(HamburgerBuilder builder) {
this.builder = builder;
}
// 定义“标准汉堡”的建造流程
public Hamburger buildStandardHamburger() {
builder.buildBread();
builder.buildMeat();
builder.buildVeggies();
builder.buildSauce();
return builder.getHamburger();
}
}
// 使用示例
public class BuilderDemo {
public static void main(String[] args) {
// 要鸡肉堡?找鸡肉堡建造者+服务员
HamburgerBuilder chickenBuilder = new ChickenBurgerBuilder();
Waiter waiter = new Waiter(chickenBuilder);
Hamburger chickenBurger = waiter.buildStandardHamburger();
System.out.println("建造了一个:" + chickenBurger.getBread() +
" + " + chickenBurger.getMeat() + " + " +
chickenBurger.getVeggies() + " + " +
chickenBurger.getSauce());
}
}
建造者模式和工厂模式的区别
- 工厂模式:“一步到位” 创建简单对象(如直接 new 一个汉堡)。
- 建造者模式:“分步组装” 创建复杂对象(如分步骤造汉堡的各个部分)。
实际场景举例
- JDK 中的
StringBuilder
(一步步 append 字符,最后 toString ())。 - SQL 语句构建(分步骤拼表名、条件、排序,避免 SQL 注入)。
- JDK 中的