我的在CSDN上的BLOG:http://blog.csdn.net/feb13/article/details/7837306java
如下是读《设计模式——可复用面向对象软件的基础》的读书笔记。算法
BUILDER生成器设计模式
一、 意图ide
将一个复杂对象的构建与它的表示分离,使得一样的构建过程能够建立不一样的表示。ui
二、 适用性this
在如下状况下使用Builder模式spa
三、 结构.net
此模式结构以下图所示设计
四、 参与者code
Builder
——为建立一个Product对象的各个部件指定抽象接口。
ConcreteBuilder
——实现Builder的接口以构造和装配该产品的各个部件。
——定义并明确它所建立的表示。
——提供一个检索产品的接口。
Director
——构造一个使用Builder接口的对象。
Product
——表示被构造的复杂对象。ConcreteBuilder建立该产品的内部表示并定义它的装配过程。
——包含定义组成部分的类,包括将这些部件装配成最终产品的接口。
五、 协助
下面的时序图说明了Builder和Director是如何与一个客户协做的。
六、 效果
下面是Builder的主要效果:
1)它使你能够改变一个产品的内部表示 Builder对象提供给导向器一个构造产品的抽象接口。该接口使得生成器能够隐藏这个产品的表示和内部结构。它同时也隐藏了该产品是如何装配的。
2)它将构造代码和表示代码分开 Builder模式经过封装一个复杂对象的建立和表示方法提升了对象的模块性。客户不须要知道定义产品内部结构的类的全部信息;这些类不出如今Builder代码中。
3)它使你可对构造过程进行更精细的控制 Builder模式与一会儿就生成产品的建立型式不一样,它是在导向者的控制下一步一步构造产品的。仅当该产品完成时导向者才从生成器中取回它。所以,Builder接口相比其余建立型模式能更好地反映产品的构造过程。
七、 实现
一般有一个抽象的Builder类为导向者可能要求建立的每个构件定义一个操做。这些操做缺省状况下什么都不作。一个ConcreteBuilder类对它有兴趣建立的构件重定义这些操做。
如下是其余一些要考虑的实现问题。
1)装配和构造接口 生成器逐步地构造它们的产品。所以Builder类接口必须足够广泛,以便为各类类型的具体生成器构造产品。
2)为何产品没有抽象 一般状况下,由具体生成器生成的产品,它们的表示相差很大,因此给不一样的产品给以公共父类没有太大意义。
3)在Builder中缺省的方法为空 生成方法故意不声明为纯虚成员方法,而是把它们定义为空方法,这使得客户只重定义他们感兴趣的操做。
八、 相关示例
Builder
- package com.examples.pattern.builder;
- public interface PersonBuilder {
- public void buildHead();
- public void buildBody();
- public void buildFoot();
- public Person getPerson();
- }
ConcreteBuilder
package com.examples.pattern.builder; public class ManBuilder implements PersonBuilder { Person person; public ManBuilder() { this.person = new Man(); } @Override public void buildBody() { person.setBody("构建Man的Body"); } @Override public void buildFoot() { person.setFoot("构建Man的Foot"); } @Override public void buildHead() { person.setFoot("构建Man的Head"); } @Override public Person getPerson() { // TODO Auto-generated method stub return null; } }
Director
package com.examples.pattern.builder; public class PersonDirector { private PersonBuilder pb; public PersonDirector(PersonBuilder pb){ this.pb = pb; } public void construct(){ pb.buildHead(); pb.buildBody(); pb.buildFoot(); } }
Product
package com.examples.pattern.builder; public class Person { private String head; private String body; private String foot; public String getHead() { return head; } public void setHead(String head) { this.head = head; } public String getBody() { return body; } public void setBody(String body) { this.body = body; } public String getFoot() { return foot; } public void setFoot(String foot) { this.foot = foot; } }
package com.examples.pattern.builder; public class Man extends Person { }
Client
package com.examples.pattern.builder; public class Client { public static void main(String[] args) { ManBuilder manBuilder = new ManBuilder(); PersonDirector director = new PersonDirector(manBuilder); director.construct(); Person person = manBuilder.getPerson(); System.out.println(person.getHead()); System.out.println(person.getBody()); System.out.println(person.getFoot()); } }
九、 相关模式
Abstract Factory与Builder类似,由于它也能够建立复杂对象。主要区别是Builder模式着重于一步一步构造复杂对象;而Abstract Factory着重于多个系列的产品对象(简单的或复杂的)。Builder在最后的一步返回产品,而对于Abstract Factory来讲,产品是当即返回的。