当需要将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,就可以使用建造者模式。 在建造者模式中,用户只需要指定需要建造的类型就可以得到它们,而建造的具体过程和细节是不需要知道的。
下面使用建造小人,举例说明该模式:
首先创建不同的建造者:
/// <summary> /// 建造者的接口,定义了建造某个对象需要的部分 /// </summary> public interface IPersonBuilder { void BuildHead(); void BuildBody(); void BuildArm(); void BuildLeg(); } /// <summary> /// 具体的建造者,继承建造者接口,实现了每个部分的细节 /// </summary> public class TallPersonBuilder : IPersonBuilder { public void BuildHead() { Console.WriteLine("Build Tall Person Head"); } public void BuildBody() { Console.WriteLine("Build Tall Build Body"); } public void BuildArm() { Console.WriteLine("Build Tall Build Arm"); } public void BuildLeg() { Console.WriteLine("Build Tall Build Leg"); } } public class SmallPersonBuilder : IPersonBuilder { public void BuildHead() { Console.WriteLine("Build Small Person Head"); } public void BuildBody() { Console.WriteLine("Build Small Build Body"); } public void BuildArm() { Console.WriteLine("Build Small Build Arm"); } public void BuildLeg() { Console.WriteLine("Build Small Build Leg"); } }
然后,定义指挥者,该指挥者定义了建造的步骤,但不包含具体的实现:
/// <summary> /// 指挥者类,详细定义了建造的过程,隔离用户与建造过程的关联 /// </summary> public class PersonDirector { private IPersonBuilder personBuilder; public PersonDirector(IPersonBuilder personBuilder) { this.personBuilder = personBuilder; } public void CreatePerson() { personBuilder.BuildHead(); personBuilder.BuildBody(); personBuilder.BuildArm(); personBuilder.BuildLeg(); } }
客户端使用指挥者和某个具体的建造者,得到需要的对象:
SmallPersonBuilder sb = new SmallPersonBuilder(); PersonDirector director1 = new PersonDirector(sb); director1.CreatePerson(); TallPersonBuilder tb = new TallPersonBuilder(); PersonDirector director2 = new PersonDirector(tb); director2.CreatePerson();
建造者模式主要是用于创建一些复杂的对象,这些对象内部构件的建造顺序通常是稳定的,但内部构件的实现面临着复杂的变化。它的好处是使得建造代码与实现代码分离,建造者隐藏了产品是如何组装的,所以若需要改变一个产品的内部实现,只需要改变具体的建造者就可以了。因此建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式。