定义
建造者模式(Builder Pattern):将复杂对象的构造与其表示分离,以便相同的构造过程可以创建不同的表示。
主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
想象一个角色扮演游戏的角色生成器。最简单的选择是让计算机为您创建角色。但是,如果你想选择角色的细节,比如职业、性别、头发颜色等,那么角色的生成就成了一个循序渐进的过程,当所有的选择都准备好时,这个过程就完成了。
C#例子
public class People
{
private readonly string _profession;
private readonly string _name;
private string _hairType;
private string _hairColor;
public People(Builder builder)
{
this._profession = builder.Profession;
this._name = builder.Name;
this._hairColor = builder.HairColor??"黑";
this._hairType = builder.HairType??"短发";
}
public string Show() {
return string.Format("这个人的名字是{1},职业是{0},有一头{2}色的{3}",_profession,_name,_hairColor,_hairType);
}
}
public sealed class Builder
{
public string Profession { get; private set; }
public string Name { get; private set; }
public string HairType { get; private set; }
public string HairColor { get; private set; }
public Builder(string profession, string name)
{
if (profession == null || name == null)
{
throw new Exception("profession 和 name 不能为空");
}
this.Profession = profession;
this.Name = name;
}
public Builder WithHairType(string hairType)
{
this.HairType = hairType;
return this;
}
public Builder WithHairColor(string hairColor)
{
this.HairColor = hairColor;
return this;
}
public People Build()
{
return new People(this);
}
}
static void Main(string[] args)
{
People people1 = new Builder("厨师", "张三")
.WithHairColor("黑")
.WithHairType("波浪卷发")
.Build();
Console.WriteLine(people1.Show());
People people2 = new Builder("程序员", "李四")
.WithHairColor("白")
.Build();
Console.WriteLine(people2.Show());
Console.ReadLine();
}
建造者模式参与者:
- People:被构建的对象,一般这样的对象构建复杂。
- Builder:建造者对象,提供分部构建People的各种方法。
建造者模式适用情形
- 创建复杂对象的算法应该独立于组成对象的各个部分以及它们的组装方式;
- 构造过程必须允许对构造的对象进行不同的表示。
建造者模式特点
- 允许您创建不同风格的对象,同时避免构造函数污染。当一个对象可能有多种风格时很有用。或者当有很多步骤涉及到对象的创建时。
- 与工厂模式的区别是:建造者模式更加关注与零件装配的顺序
其他
实例
- System.Text.StringBuilder
源码地址
其他设计模式