个人在CSDN上的BLOG:http://blog.csdn.net/feb13/article/details/7837306

以下是读《设计模式——可复用面向对象软件的基础》的读书笔记。

BUILDER生成器

1、 意图

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

2、 适用性

在以下情况下使用Builder模式

  •  当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
  • 当构造过程必须允许被构造的对象有不同的表示时。

3、 结构

此模式结构如下图所示

 

4、 参与者

Builder

            ——为创建一个Product对象的各个部件指定抽象接口。

ConcreteBuilder

            ——实现Builder的接口以构造和装配该产品的各个部件。
            ——定义并明确它所创建的表示。
            ——提供一个检索产品的接口。

Director  

           ——构造一个使用Builder接口的对象。

Product   

          ——表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程。
          ——包含定义组成部分的类,包括将这些部件装配成最终产品的接口。

5、 协助

  •  客户创建Director对象,并用它所想要的Builder对象进行配置。
  • 一旦产品部件被生成,导向器就会通知生成器。
  • 生成器处理导向器的请求,并将部件添加到该产品中。
  • 客户从生成器中检索产品。

下面的时序图说明了Builder和Director是如何与一个客户协作的。

6、 效果

下面是Builder的主要效果:

1)它使你可以改变一个产品的内部表示             Builder对象提供给导向器一个构造产品的抽象接口。该接口使得生成器可以隐藏这个产品的表示和内部结构。它同时也隐藏了该产品是如何装配的。

2)它将构造代码和表示代码分开        Builder模式通过封装一个复杂对象的创建和表示方法提高了对象的模块性。客户不需要知道定义产品内部结构的类的所有信息;这些类不出现在Builder代码中。

3)它使你可对构造过程进行更精细的控制        Builder模式与一下子就生成产品的创建型式不同,它是在导向者的控制下一步一步构造产品的。仅当该产品完成时导向者才从生成器中取回它。因此,Builder接口相比其他创建型模式能更好地反映产品的构造过程。

7、 实现

通常有一个抽象的Builder类为导向者可能要求创建的每一个构件定义一个操作。这些操作缺省情况下什么都不做。一个ConcreteBuilder类对它有兴趣创建的构件重定义这些操作。

以下是其他一些要考虑的实现问题。

1)装配和构造接口        生成器逐步地构造它们的产品。因此Builder类接口必须足够普遍,以便为各种类型的具体生成器构造产品。

2)为什么产品没有抽象        通常情况下,由具体生成器生成的产品,它们的表示相差很大,所以给不同的产品给以公共父类没有太大意义。

3)在Builder中缺省的方法为空         生成方法故意不声明为纯虚成员方法,而是把它们定义为空方法,这使得客户只重定义他们感兴趣的操作。

8、 相关示例

Builder

 
  1. package com.examples.pattern.builder;    
  2. public interface PersonBuilder {     
  3.     public void buildHead(); 
  4.     public void buildBody();     
  5.     public void buildFoot(); 
  6.     public Person getPerson();    
  7. }  

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());	}}

9、 相关模式

Abstract Factory与Builder相似,因为它也可以创建复杂对象。主要区别是Builder模式着重于一步一步构造复杂对象;而Abstract Factory着重于多个系列的产品对象(简单的或复杂的)。Builder在最后的一步返回产品,而对于Abstract Factory来说,产品是立即返回的。