我的在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來講,產品是當即返回的。