设计模式之建造者模式
建造者模式定义
建造者模式是一种创建型设计模式(有的也称之为生成器模式), 使你能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象。
建造者模式结构
- 建造者/生成器(Builder):清晰的定义通用步骤,确保它们可以制造所有形式的产品。 否则你将无法进一步实施该模式。
- 具体建造者(ConcreteBuilder):每个形式的产品创建具体生成器类, 并实现其构造步骤。
- 指挥者(Director):它可以使用同一生成器对象来封装多种构造产品的方式。
建造者模式实现
场景:盖房子,房子都有房顶、四面墙壁、窗户和门,可以使用不同的材料,例如,第一个建造者使用木头和玻璃,第二个建造者使用石头和钢铁。在调用一组步骤后,第一个建造者得到的是一栋普通房屋,第二栋得到的是一栋城堡
使用代码简单实现一下:
声明创建房屋通用步骤的接口
public interface IHouseBuilder
{
void buildWall();
void buildRoof();
void buildWindow();
void buildDoor();
void buildResult();
}
创建具体建造者,继承接口并实现
public class House : IHouseBuilder
{
public void buildDoor()
{
Console.WriteLine("装房门");
}
public void buildResult()
{
Console.WriteLine("普通木屋");
}
public void buildRoof()
{
Console.WriteLine("盖房顶");
}
public void buildWall()
{
Console.WriteLine("盖墙壁");
}
public void buildWindow()
{
Console.WriteLine("安装窗户");
}
}
创建指挥者,用于构建和组织步骤
public class HouseDirector
{
public void Construct(IHouseBuilder houseBuilder)
{
houseBuilder.buildWall();
houseBuilder.buildWall();
houseBuilder.buildWindow();
houseBuilder.buildDoor();
}
}
客户端调用
static void Main(string[] args)
{
HouseDirector houseDirector = new HouseDirector();
Console.WriteLine("------------------盖一栋普通木屋------------------");
IHouseBuilder houseBuilder1 = new House();
houseDirector.Construct(houseBuilder1);
houseBuilder1.buildResult();
Console.WriteLine("------------------盖一栋城堡------------------");
IHouseBuilder houseBuilder2 = new Tower();
houseDirector.Construct(houseBuilder2);
houseBuilder2.buildResult();
Console.WriteLine("Press Any Key to end!");
Console.ReadKey();
}
输出结果
建造者模式优缺点
优点
- 可以分步创建对象, 暂缓创建步骤或递归运行创建步骤。
- 生成不同形式的产品时, 你可以复用相同的制造代码。
- 单一职责原则。 你可以将复杂构造代码从产品的业务逻辑中分离出来。
缺点
- 由于该模式需要新增多个类, 因此代码整体复杂程度会有所增加。
建造者模式使用场景
- 当你希望使用代码创建不同形式的产品(例如石头或木头房屋)时,可使用生成器模式
- 使用生成器构造组合树或其他复杂对象。