設(shè)計(jì)模式總結(jié)筆記<三> 建造者模式后篇

文章同步發(fā)放到CSDN博客

定義:
建造者模式:將一個(gè)復(fù)雜的對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。

實(shí)用范圍
1、當(dāng)創(chuàng)建復(fù)雜對(duì)象的算法應(yīng)該獨(dú)立于該對(duì)象的組成部分以及它們的裝配方式時(shí)。
2、當(dāng)構(gòu)造過程必須允許被構(gòu)造的對(duì)象有不同表示時(shí)。

角色
在這樣的設(shè)計(jì)模式中,有以下幾個(gè)角色:
1、Builder:為創(chuàng)建一個(gè)產(chǎn)品對(duì)象的各個(gè)部件指定抽象接口。
2、ConcreteBuilder:實(shí)現(xiàn)Builder的接口以構(gòu)造和裝配該產(chǎn)品的各個(gè)部件,定義并明確它所創(chuàng)建的表示,并提供一個(gè)檢索產(chǎn)品的接口。
3、Director:構(gòu)造一個(gè)使用Builder接口的對(duì)象,指導(dǎo)構(gòu)建過程。
4、Product:表示被構(gòu)造的復(fù)雜對(duì)象。ConcreteBuilder創(chuàng)建該產(chǎn)品的內(nèi)部表示并定義它的裝配過程,包含定義組成部件的類,包括將這些部件裝配成最終產(chǎn)品的接口。

角色Builder:

public interface PersonBuilder {  
     void buildHead();  
     void buildBody();  
     void buildFoot();  
     Person buildPerson();  
}  

角色ConcreteBuilder:

public class ManBuilder implements PersonBuilder {  
     Person person;  
     public ManBuilder() {  
          person = new Man();  
     }  
     public void buildbody() {  
          person.setBody("建造男人的身體");  
     }  
     public void buildFoot() {  
          person.setFoot("建造男人的腳");  
     }  
     public void buildHead() {  
          person.setHead("建造男人的頭");  
     }  
     public Person buildPerson() {  
          return person;  
     }  
}  

角色ConcreteBuilder:

public class WomanBuilder implements PersonBuilder {  
     Person person;  
     public WomanBuilder() {  
          person = new Woman();  
     }  
     public void buildbody() {  
          person.setBody(“建造女人的身體");  
     }  
     public void buildFoot() {  
          person.setFoot(“建造女人的腳");  
     }  
     public void buildHead() {  
          person.setHead(“建造女人的頭");  
     }  
     public Person buildPerson() {  
          return person;  
     }  
}  

角色Director:

public class PersonDirector {  
     public Person constructPerson(PersonBuilder pb) {  
          pb.buildHead();  
          pb.buildBody();  
          pb.buildFoot();  
          return pb.buildPerson();  
     }  
}  

角色Product:

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;  
     }  
}  
public class Man extends Person {  
     public Man(){  
          System.out.println(“開始建造男人");  
     }  
}  
public class Woman extends Person {  
     public Woman(){  
          System.out.println(“開始建造女人");  
     }  
}  

測(cè)試:

public class Test{  
     public static void main(String[] args) {  
          PersonDirector pd = new PersonDirector();  
          Person womanPerson = pd.constructPerson(new ManBuilder());  
          Person manPerson = pd.constructPerson(new WomanBuilder());  
     }  
}  

建造者模式在使用過程中可以演化出多種形式:
如果具體的被建造對(duì)象只有一個(gè)的話,可以省略抽象的Builder和Director,讓ConcreteBuilder自己扮演指導(dǎo)者和建造者雙重角色,甚至ConcreteBuilder也可以放到Product里面實(shí)現(xiàn)。
在《Effective Java》書中第二條,就提到“遇到多個(gè)構(gòu)造器參數(shù)時(shí)要考慮用構(gòu)建器”,其實(shí)這里的構(gòu)建器就屬于建造者模式,只是里面把四個(gè)角色都放到具體產(chǎn)品里面了。

上面例子如果只制造男人,演化后如下:

public class Man {  
     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;  
     }  
}  
public class ManBuilder{  
     Man man;  
     public ManBuilder() {  
          man = new Man();  
     }  
     public void buildbody() {  
          man.setBody("建造男人的身體");  
     }  
     public void buildFoot() {  
          man.setFoot("建造男人的腳");  
     }  
     public void buildHead() {  
          man.setHead("建造男人的頭");  
     }  
     public Man builderMan() {  
          buildHead();  
          buildBody();  
          buildFoot();  
          return man;  
     }  
}  

測(cè)試:

public class Test{  
     public static void main(String[] args) {  
          ManBuilder builder = new ManBuilder();  
          Man man = builder.builderMan();  
     }  
}  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 【學(xué)習(xí)難度:★★★★☆,使用頻率:★★☆☆☆】直接出處:建造者模式梳理和學(xué)習(xí):https://github.com...
    BruceOuyang閱讀 877評(píng)論 0 5
  • 定義 建造模式是對(duì)象的創(chuàng)建模式。建造模式可以將一個(gè)產(chǎn)品的內(nèi)部表象(internal representation)...
    步積閱讀 7,201評(píng)論 1 7
  • 原文傳送門 1 介紹 建造者模式(Builder),又叫生成器模式。是對(duì)象的創(chuàng)建模式。建造者模式可以將產(chǎn)品的內(nèi)部表...
    dd299閱讀 834評(píng)論 0 2
  • 目錄 本文的結(jié)構(gòu)如下: 引言 什么是建造者模式 模式的結(jié)構(gòu) 典型代碼 代碼示例 Builder模式變種 建造者模式...
    w1992wishes閱讀 502評(píng)論 0 3
  • 現(xiàn)代社會(huì)講自由、自我,大家都是你我相看兩生厭! 厭惡他,見到躲著走,盡量不見最好。然而,命運(yùn)捉弄,電梯出了問題,就...
    和悅陽(yáng)光閱讀 188評(píng)論 0 3

友情鏈接更多精彩內(nèi)容