java設計模式之建造者模式

來源:互聯網
上載者:User

標籤:

本文繼續介紹23種設計模式系列之建造者模式。

定義: 建造者模式:將一個複雜的對象的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。

實用範圍 1、當建立複雜物件的演算法應該獨立於該對象的組成部分以及它們的裝配方式時。 2、當構造過程必須允許被構造的對象有不同表示時。

角色 在這樣的設計模式中,有以下幾個角色: 1、Builder:為建立一個產品對象的各個組件指定抽象介面。 2、ConcreteBuilder:實現Builder的介面以構造和裝配該產品的各個組件,定義並明確它所建立的表示,並提供一個檢索產品的介面。 3、Director:構造一個使用Builder介面的對象,指導構建過程。 4、Product:表示被構造的複雜物件。ConcreteBuilder建立該產品的內部表示並定義它的裝配過程,包含定義組成組件的類,包括將這些組件裝配成最終產品的介面。

角色Builder: [java] view plaincopyprint?在CODE上查看代碼片派生到My Code片 public interface PersonBuilder {       void buildHead();       void buildBody();       void buildFoot();       Person buildPerson();  } 

角色ConcreteBuilder: [java] view plaincopyprint?在CODE上查看代碼片派生到My Code片 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: [java] view plaincopyprint?在CODE上查看代碼片派生到My Code片 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: [java] view plaincopyprint?在CODE上查看代碼片派生到My Code片 public class PersonDirector {       public Person constructPerson(PersonBuilder pb) {            pb.buildHead();            pb.buildBody();            pb.buildFoot();            return pb.buildPerson();       }  } 

角色Product: [java] view plaincopyprint?在CODE上查看代碼片派生到My Code片 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(“開始建造女人");       }  } 

測試: [java] view plaincopyprint?在CODE上查看代碼片派生到My Code片 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());       }  } 

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

上面例子如果只製造男人,演化後如下: [java] view plaincopyprint?在CODE上查看代碼片派生到My Code片 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;       }  } 

[java] view plaincopyprint?在CODE上查看代碼片派生到My Code片 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;       }  } 

測試: [java] view plaincopyprint?在CODE上查看代碼片派生到My Code片 public class Test{       public static void main(String[] args) {            ManBuilder builder = new ManBuilder();            Man man = builder.builderMan(); 

java設計模式之建造者模式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.