標籤:
本文繼續介紹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設計模式之建造者模式