一、建造者模式:如果创建某个对象要经过多个组件组装才能完成,我们可以设计一个充当建造者角色的类和一个充当指挥者的类,通过指挥者控制建造者按步骤组装需要创建的对象,这样客户端就只依赖于指挥者类。
二、实现思路 :设计一个建造者类,其中包含要创建对象的所有组件的创建方法,然后再创建一个指挥者,指挥建造者方法执行对象的创建。
三、代码举例:
抽象类AbstractBuilder:
namespace Builder { public abstract class AbstractBuilder { public abstract void CreateCpu(); public abstract void CreateMainboard(); public abstract void CreateRom(); public abstract void CreateRam(); public abstract void CreateComputer(); } }
实现类AcerBuilder:
namespace Builder { public class AcerBuilder : AbstractBuilder { public override void CreateComputer() { Console.WriteLine("组装成Acer电脑"); } public override void CreateCpu() { Console.WriteLine("创建cpu"); } public override void CreateMainboard() { Console.WriteLine("创建主板"); } public override void CreateRam() { Console.WriteLine("创建Ram内存条"); } public override void CreateRom() { Console.WriteLine("创建Rom硬盘"); } } }
实现类DellBuilder:
namespace Builder { public class DellBuilder : AbstractBuilder { public override void CreateComputer() { Console.WriteLine("组装成Dell电脑"); } public override void CreateCpu() { Console.WriteLine("创建cpu"); } public override void CreateMainboard() { Console.WriteLine("创建主板"); } public override void CreateRam() { Console.WriteLine("创建Ram内存条"); } public override void CreateRom() { Console.WriteLine("创建Rom硬盘"); } } }
指挥者类Director:
namespace Builder { public class Director { public AbstractBuilder builder = null; public Director(AbstractBuilder builder) { this.builder = builder; } public void GetComputer() { Console.WriteLine("正在指挥builder生产电脑..."); this.builder.CreateCpu(); this.builder.CreateMainboard(); this.builder.CreateRam(); this.builder.CreateRom(); Console.WriteLine("builder生产电脑组件完成..."); this.builder.CreateComputer(); Console.WriteLine("电脑组装完成!"); } } }
客户类:
{ //建造者模式中包含2个角色,指挥者和建造者 Builder.AbstractBuilder Acerbuilder = new Builder.AcerBuilder();//充当建造者,建造对象组件 Builder.Director director0 = new Builder.Director(Acerbuilder);//充当指挥者,控制建造者建造过程 director0.GetComputer();//交互产品 Builder.AbstractBuilder Dellbuilder = new Builder.DellBuilder();//充当建造者,建造对象组件 Builder.Director director1 = new Builder.Director(Dellbuilder);//充当指挥者,控制建造者建造过程 director1.GetComputer();//交互产品 }
运行结果:
四、建造者模式的优缺点及应用:它适用于非常复杂的对象的创建,通常这种复杂的对象具有很多创建步骤,建造者模式关注的不是转移细节,而是关注对象的创建步骤,在指挥者类中不应该包含除了控制建造者执行组件创建逻辑以外额其他逻辑。