建造者模式





5.00/5 (1投票)
建造者模式描述了一种将对象与其构造过程分离的方式。相同的构造方法可以创建对象的不同表示。
相同的构造方法可以创建对象的不同表示。
在以下情况中使用该模式
- 您需要构造一个具有不同表示形式的复杂对象。
表示形式。 - 创建对象的算法应独立于
对象的各个部分的组装方式。
有关该模式的 UML 图,请访问 dofactory 网站。
C# 示例
让我们看一个建造者示例
#region 指挥者
/// <summary>
/// 承包商负责
/// 房屋的建造。
/// </summary>
class Contractor
{
#region 方法
/// <summary>
/// 使用给定的
/// 房屋建造者
/// </summary>
/// <param name="house"></param>
public void Construct(HouseBuilder houseBuilder)
{
houseBuilder.BuildFloor();
houseBuilder.BuildWalls();
houseBuilder.BuildDoors();
houseBuilder.BuildWindows();
}
#endregion
}
#endregion
#region 建造者
abstract class HouseBuilder
{
#region 成员
protected House _house;
#endregion
#region 属性
public House House
{
get
{
return _house;
}
}
#endregion
#region 建造方法
public abstract void BuildDoors();
public abstract void BuildWindows();
public abstract void BuildWalls();
public abstract void BuildFloor();
#endregion
}
#endregion
#region 建造者产品
class HousePart
{
#region 成员
private string _strPartName;
#endregion
#region 属性
/// <summary>
/// 部件名称
/// </summary>
public string PartName
{
get
{
return _strPartName;
}
}
#endregion
#region 构造函数
/// <summary>
/// 使用给定的
/// 名称构造一个新的房屋部件。
/// </summary>
/// <param name="name">给定的名称</param>
public HousePart(string name)
{
_strPartName = name;
}
#endregion
}
class House
{
#region 成员
private string _material;
private List<HousePart> _houseParts;
#endregion
#region 属性
/// <summary>
/// 建筑材料
/// </summary>
public string Material
{
get
{
return _material;
}
}
#endregion
#region 构造函数
/// <summary>
/// 使用给定的
/// 材料构造一个新的房屋。
/// </summary>
/// <param name="material">给定的材料</param>
public House(string material)
{
_material = material;
_houseParts = new List<HousePart>();
}
#endregion
#region 方法
/// <summary>
/// 将房屋的一个部件添加到房屋中
/// </summary>
/// <param name="part">要添加的部件</param>
public void AddPart(HousePart part)
{
_houseParts.Add(part);
}
#endregion
}
#endregion
#region 具体建造者
class GlassHouseBuilder : HouseBuilder
{
#region 方法
public override void BuildFloor()
{
_house = new House("glass");
House.AddPart(new HousePart("stone floor"));
}
public override void BuildWalls()
{
House.AddPart(new HousePart(House.Material +
" walls"));
}
public override void BuildDoors()
{
House.AddPart(new HousePart("wood doors"));
}
public override void BuildWindows()
{
House.AddPart(new HousePart(House.Material +
" windows"));
}
#endregion
}
class WoodHouseBuilder : HouseBuilder
{
#region 方法
public override void BuildFloor()
{
_house = new House("wood");
House.AddPart(new HousePart(House.Material +
" floor"));
}
public override void BuildWalls()
{
House.AddPart(new HousePart(House.Material +
" floor"));
}
public override void BuildDoors()
{
House.AddPart(new HousePart("iron doors"));
}
public override void BuildWindows()
{
House.AddPart(new HousePart("glass floor"));
}
#endregion
}
#endregion
这个例子很容易理解。有一个房屋承包商负责
按正确的顺序建造房屋。我们有一个建造者
抽象类,它为具体建造者定义了接口。
每个具体类都负责实现抽象方法,
因此以不同的方式构建部件。
摘要
总而言之,建造者模式并不常用。
它在某些方面与抽象工厂相似,但它们之间的区别是
建造者关注对象是如何被构建的,通过
不同的具体实现,而抽象工厂则关注的是什么产品
被构建。正如您在示例中看到的,有一个指挥者来组织
建造部件,从而使建造算法变得抽象。