13. 建造者模式
约 856 字大约 3 分钟
2026-03-05
建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
人话:建造者模式就像做饭。比如麦当劳的汉堡,无论在哪个门店,按照同一套流程和标准去做,做出来的味道基本都是一样的,因为制作步骤被严格规定好了。但像鱼香肉丝这种家常菜,不同厨师做出来的味道往往差别很大,有的人偏甜,有的人偏辣,有的人会多放蒜或者多放醋。
在软件中也是类似的:制作流程(步骤)可以是一样的,但具体实现这些步骤的人不同,最后得到的产品就可能不同。建造者模式就是把“制作流程”和“具体怎么做”分开,流程由指挥者统一安排,而不同的建造者负责按自己的方式完成这些步骤。
建造者模式(Bulider)结构图
- 如果你需要将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示的意图时,我们需要应用于一个设计模式,‘建造者(Builder)模式’,又叫生成器模式。建造者模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。如果我们用了建造者模式,那么用户就只需指定需要建造的类型就可以得到它们,而具体建造的过程和细节就不需知道了。
Director 类(指挥者):
public class Director
{
// 指挥建造过程,必须有 PartA 和 PartB
public void Construct(Builder builder)
{
builder.BuildPartA();
builder.BuildPartB();
}
}Builder 类(抽象建造者):
public abstract class Builder
{
public abstract void BuildPartA();
public abstract void BuildPartB();
public abstract Product GetResult();
}ConcreteBuilder1 类(具体建造者):
public class ConcreteBuilder1 : Builder
{
private Product product = new Product();
// 建造 A 和 B
public override void BuildPartA()
{
product.Add("部件A");
}
public override void BuildPartB()
{
product.Add("部件B");
}
public override Product GetResult()
{
return product;
}
}ConcreteBuilder2 类(具体建造者):
public class ConcreteBuilder2 : Builder
{
private Product product = new Product();
// 建造 X 和 Y
public override void BuildPartA()
{
product.Add("部件X");
}
public override void BuildPartB()
{
product.Add("部件Y");
}
public override Product GetResult()
{
return product;
}
}Product 类(产品类):
public class Product
{
private IList<string> parts = new List<string>();
// 添加产品部件
public void Add(string part)
{
parts.Add(part);
}
// 显示产品
public void Show()
{
Console.WriteLine("\n产品 创建 ----");
// 列举所有产品部件
foreach (string part in parts)
{
Console.WriteLine(part);
}
}
}客户端代码:
class Program
{
static void Main(string[] args)
{
Director director = new Director();
Builder b1 = new ConcreteBuilder1();
Builder b2 = new ConcreteBuilder2();
// 指挥者用 ConcreteBuilder1 的方法来建造产品
director.Construct(b1);
Product p1 = b1.GetResult();
p1.Show();
// 指挥者用 ConcreteBuilder2 的方法来建造产品
director.Construct(b2);
Product p2 = b2.GetResult();
p2.Show();
Console.Read();
}
}