建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示(过程是稳定的)。
从建造者模式的定义来看,肯定是一头雾水,说的都是什么跟什么呀!举个小例来理解下:当我们来实现一个画画的功能,要求画瘦的人和胖的人。画的过程是稳定的,即:头、胳膊、身体、腿都是必须的。而画的具体实现是不一样的,例如:头大、肚子大、腿长等。这时再去理解建造者模式的定义就简单多了。
UML图:
Builder抽象类中定义各个部分的方法的抽象方法(例:定义了画胳膊、画头、画腿等方法)。
ConcreteBuilder类是各种不一样具体表示,它具体实现了Builder中的方法,并且返回一个结果。(例:实现了具体画怎样的头、胳膊、腿等,并返回构造的这个人)
product类是具体产品,即:要建造的产品。例:头、胳膊、腿等都是要建造人
代码:
//抽象建造者类 public abstract class Builder { public abstract void Head(); public abstract void Body(); public abstract void Leg(); }
//具体建造者类 class ConcreteBuilderA:Builder { private Person person = new Person(); public override void Head() { //do something person.Head = "A式头"; } public override void Body() { //do something person.Body = "A式身体"; } public override void Leg() { //do something person.Leg = "A式腿"; } public Person GetResult() { return person; } }
//具体建造者类 class ConcreteBuilderB:Builder { private Person person = new Person(); public override void Head() { //do something person.Head = "B式头"; } public override void Body() { //do something person.Body = "B式身体"; } public override void Leg() { //do something person.Leg = "B式腿"; } public Person GetResult() { return person; }
//产品类 class Person { public Object Head { set; get; } public Object Body { set; get; } public Object Leg { set; get; } }
//指挥者类 class Director { public void Construct(Builder builder) { builder.Head(); builder.Body(); } }
执行:
static void Main(string[] args) { Director director = new Director(); ConcreteBuilderA a = new ConcreteBuilderA(); director.Construct(a); Object p = a.GetResult(); }
上述执行代码中,首先创建执行者类,再创建一个具体建造者类,然后由执行者类调用Construct方法去执行建造。而最后通过具体建造者类的GetResult方法获得了建造的结果。