设计模式-建造者模式
建造者模式(Builder Pattern)是一种创建型设计模式,它将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。该模式适用于构建过程复杂且涉及多个步骤的场景,特别适合需要灵活配置的对象。
核心概念与角色
- 产品(Product)
最终构建的复杂对象,包含多个部件(如汽车、电脑、武器等)。 - 抽象建造者(Builder)
定义构建产品各个部件的抽象接口(如BuildEngine()、BuildWheels())。
* 具体建造者(ConcreteBuilder)
实现抽象建造者的接口,提供部件构建的具体逻辑(如运动型汽车、普通房屋)。
* 指挥者(Director)
控制构建流程,按固定顺序调用建造者的方法完成对象组装(如汽车组装顺序:引擎→车轮→GPS)。
案例1:电脑组装(简化版建造者)
// 产品:电脑
public class Computer {
public string CPU { get; set; }
public int Memory { get; set; }
public int HardDisk { get; set; }
}
// 建造者类
public class ComputerBuilder {
private Computer _computer = new Computer();
public ComputerBuilder SetCPU(string type) {
_computer.CPU = type;
return this; // 链式调用
}
public ComputerBuilder SetMemory(int size) {
_computer.Memory = size;
return this;
}
public ComputerBuilder SetHardDisk(int capacity) {
_computer.HardDisk = capacity;
return this;
}
public Computer Build() => _computer;
}
// 客户端
var computer = new ComputerBuilder()
.SetCPU("Intel i7")
.SetMemory(16)
.SetHardDisk(512)
.Build();
通过链式调用逐步配置对象,代码简洁。
适用于部件较少的对象,省略了指挥者角色。
案例2:武器锻造(完整建造者模式)
// 产品:武器
public class Weapon {
private List<string> _parts = new List<string>();
public void AddPart(string part) => _parts.Add(part);
public void Show() => Console.WriteLine("武器部件: " + string.Join(", ", _parts));
}
// 抽象建造者
public abstract class WeaponBuilder {
public abstract void BuildBlade();
public abstract void BuildHandle();
public abstract Weapon GetWeapon();
}
// 具体建造者:剑
public class SwordBuilder : WeaponBuilder {
private Weapon _sword = new Weapon();
public override void BuildBlade() => _sword.AddPart("剑刃");
public override void BuildHandle() => _sword.AddPart("剑柄");
public override Weapon GetWeapon() => _sword;
}
// 指挥者
public class Blacksmith {
public Weapon Forge(WeaponBuilder builder) {
builder.BuildBlade();
builder.BuildHandle();
return builder.GetWeapon();
}
}
// 客户端
var blacksmith = new Blacksmith();
var sword = blacksmith.Forge(new SwordBuilder());
sword.Show(); // 输出:武器部件: 剑刃, 剑柄
严格分离构建步骤与表示,支持扩展新武器类型(如AxeBuilder)。
指挥者统一控制构建流程,避免客户端直接依赖具体建造者。

浙公网安备 33010602011771号