什么是建造者模式?
建造者模式也是创建型模式的一种,它将复杂对象的创建分离,使用者只需要知道复杂对象的类型就可以得到该对象,而无需知道内部的具体构造细节。如:汽车,包括诸多部件:方向盘、发动机、轮胎等,建造者模式的工作便是如何一步步创建对象的各个部件并最终组装成完整的对象。
建造者模式的结构
- Builder(抽象建造者):为创建一个复杂对象的各个部件指定抽象接口,一般包含BuildPartX和GetResult两个方法,前者用来创建复杂对象的各个组成部件,后者用于返回复杂对象,该类既可以是抽象类,也可以是接口。
- SpecificBuilder(具体建造者):该类实现了Builder的接口,实现各个部件的具体构造和装配方法,定义并明确所创建的复杂对象。
- Product(复杂对象):被构建的复杂对象,包含多个组成部件,具体建造者创建该产品的内部表示并定义它的组装过程。
- Director(指挥者):负责实现复杂对象的建造顺序,使用者一般只需要与该类进行交互,在知道具体建造者类型并实例化具体建造者对象,然后注入到指挥者类中即可。
建造者模式的实现
- 产品对象
//角色类(充当产品对象)
class Role
{
private string m_Name;
public string Name
{
get { return this.m_Name; }
set { this.m_Name = value; }
}
private string m_Sex;
public string Sex
{
get { return this.m_Sex; }
set { this.m_Sex = value; }
}
}
- 抽象建造类
//抽象角色建造类
abstract class RoleBuilder
{
protected Role m_Role = new Role();
public abstract void BuildName();
public abstract void BuildSex();
public Role CreateRole()
{
return this.m_Role;
}
}
- 具体建造者
//具体建造者
class Role1Builder : RoleBuilder
{
public override void BuildName()
{
base.m_Role.Name = "Role1";
}
public override void BuildSex()
{
base.m_Role.Sex = "男";
}
}
class Role2Builder : RoleBuilder
{
public override void BuildName()
{
base.m_Role.Name = "Role2";
}
public override void BuildSex()
{
base.m_Role.Sex = "女";
}
}
- 指挥者
//指挥者
class RoleController
{
//构建复杂对象
public Role Construct(RoleBuilder builder)
{
builder.BuildName();
builder.BuildSex();
return builder.CreateRole();
}
}
- 测试
static void Main()
{
//测试
var roleController = new RoleController();
var builder = new Role1Builder();
var role = roleController.Construct(builder);
Console.WriteLine($"姓名:{role.Name}, 性别:{role.Sex}");
Console.ReadKey();
}
- 结果
钩子方法
通过引入钩子方法可以更加精细地控制产品的创建过程,修改后的代码:
abstract class RoleBuilder
{
//添加钩子方法,角色是否有名字
public bool isHasName()
{
return true;
}
}
class RoleController
{
//构建复杂对象
public Role Construct(RoleBuilder builder)
{
//通过钩子方法控制产品的构建
if (builder.isHasName())
builder.BuildName();
builder.BuildSex();
return builder.CreateRole();
}
}
建造者模式的优点
可以更加精细的控制产品的构建过程,将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,同时符合开闭原则,易扩展。
建造者模式的缺点
建造者模式的产品需要具有较多的共同点,其组成部分相似,如果产品差异太大,则不适用建造者模式,因此适用范围受到一定的限制;如果产品变化过于复杂,需要定义很多具体建造者来满足这种变化,则会使系统变得更加庞大,增加复杂度。
什么时候使用建造者模式?
- 目标对象具有复杂的内部结构,这些对象通常包含多个成员变量。
- 目标对象的属性相互依赖,需要指定其生成顺序。
- 隔离复杂对象的创建和使用,并使得相同的创建过程得到不同的对象。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。