2 当构造过程必须允许被构造的对象有不同表示时。
4 Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
类关系图

举个简单的例子:我要需要造一个男人跟一个女孩
1.先定义一个人,跟男人女孩的具体实现
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |   //人    publicclassPerson    {        //头        privateString head;        //身体        privateString body;        //脚        privateString foot;        publicString getHead()        {            returnhead;        }        publicvoidsetHead(String head)        {            this.head = head;        }        publicString getBody()        {            returnbody;        }        publicvoidsetBody(String body)        {            this.body = body;        }        publicString getFoot()        {            returnfoot;        }        publicvoidsetFoot(String foot)        {            this.foot = foot;        }    }    //男人   product产品类    publicclassMan : Person    {    }    //女孩  product产品类    publicclassgirl : Person    {    } | 
2.抽象一个建造的工具,及具体的建造过程
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |  //Builder 抽象建造者    publicinterfacePersonBuilder    {        voidbuildHead();        voidbuildBody();        voidbuildFoot();        Person buildPerson();    }    //ConcreteBuilder 具体建造者    publicclassManBuilder : PersonBuilder    {        Person person;        publicManBuilder()        {            person = newMan();        }        publicvoidbuildBody()        {            person.setBody("建造男人的身体");        }        publicvoidbuildFoot()        {            person.setFoot("建造男人的脚");        }        publicvoidbuildHead()        {            person.setHead("建造男人的头");        }        publicPerson buildPerson()        {            returnperson;        }    }    publicclassGirlBuilder : PersonBuilder    {        Person person;        publicGirlBuilder()        {            person = newMan();        }        publicvoidbuildBody()        {            person.setBody("建造女孩的身体");        }        publicvoidbuildFoot()        {            person.setFoot("建造女孩的脚");        }        publicvoidbuildHead()        {            person.setHead("建造女孩的头");        }        publicPerson buildPerson()        {            returnperson;        }    } | 
3.最后建立一个场景,导演,或者是跟客户进行沟通的人
| 1 2 3 4 5 6 7 8 9 10 11 |   //  Director类    publicclassPersonDirector    {        publicPerson constructPerson(PersonBuilder pb)        {            pb.buildHead();            pb.buildBody();            pb.buildFoot();            returnpb.buildPerson();        }    } | 
4.根据客户的需求 给于不同的产品,比如需要一个男人,或者需要一个女人。
| 1 2 3 4 5 6 7 8 9 10 11 |     classProgram    {        staticvoidMain(string[] args)        {            //建造一个男人            Person man = newPersonDirector().constructPerson(newManBuilder());            //建造一个女孩            Person girl = newPersonDirector().constructPerson(newGirlBuilder());        }    } | 
上面仅仅是建造者模式中的一种用法,不同的需求有很多种不同的用法,举例多了反而容易混。理解里面的核心就行了 ,建造者:就是不用管我怎么去建造的,告诉我你想要什么,我就内部加工,建造好了给你。
扩展
建造者演化的其它方式:
1.省略抽象建造者角色
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |   //  Director类    publicclassPersonDirector    {       //获取男人        publicPerson GetManPerson()        {            ManBuilder pb=newManBuilder ();            pb.buildHead();            pb.buildBody();            pb.buildFoot();            returnpb.buildPerson();        }        //获取女孩        publicPerson GetGirlPerson()        {            GirlBuilder pb=newGirlBuilder ();            pb.buildHead();            pb.buildBody();            pb.buildFoot();            returnpb.buildPerson();        }    }    //client    classProgram    {        staticvoidMain(string[] args)        {            //建造一个男人            Person man = newPersonDirector().GetManPerson;            //建造一个女孩            Person girl = newPersonDirector().GetManPerson;        }    } | 
2.省略指导者角色
在具体建造者只有一个的情况下,如果抽象建造者角色已经被省略掉,那么还可以省略掉指导者角色,让Builder自己扮演指导者和建造者双重角色 //client
| 1 2 3 4 5 6 7 8 9 10 11 12 13 |     classProgram    {        staticvoidMain(string[] args)        {            //建造一个男人           ManBuilder pb=newManBuilder ();            pb.buildHead();            pb.buildBody();            pb.buildFoot();            pb.buildPerson();        }    } | 
看到这之后 你有没发现,其实自己在开发的过程中进行的一些封装调用,用的就是建造者模式。O(∩_∩)O哈哈~ 不要怀疑你的眼睛。其实你已经早就在用了
优点
1.封装性:
使用建造者模式可以使客户端不必知道产品内部组成的细节。
2.独立,容易扩展
3.便于控制细节
建造者是独立的,因此可以对建造者的过程细化,而不对其它的额模块产生影响。
设计模式系列文章入口:http://www.diyibk.com/post/39.html
第4章 建造者模式(Builder Pattern),布布扣,bubuko.com
原文地址:http://www.cnblogs.com/lonelyxmas/p/3720814.html