java設計模式之建造者模式,java設計模式建造
本文繼續介紹23種設計模式系列之建造者模式。
定義:建造者模式:將一個複雜的對象的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。
實用範圍1、當建立複雜物件的演算法應該獨立於該對象的組成部分以及它們的裝配方式時。2、當構造過程必須允許被構造的對象有不同表示時。
角色在這樣的設計模式中,有以下幾個角色:1、Builder:為建立一個產品對象的各個組件指定抽象介面。2、ConcreteBuilder:實現Builder的介面以構造和裝配該產品的各個組件,定義並明確它所建立的表示,並提供一個檢索產品的介面。3、Director:構造一個使用Builder介面的對象,指導構建過程。4、Product:表示被構造的複雜物件。ConcreteBuilder建立該產品的內部表示並定義它的裝配過程,包含定義組成組件的類,包括將這些組件裝配成最終產品的介面。
角色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(“開始建造女人"); }}
測試:
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》書中第二條,就提到“遇到多個構造器參數時要考慮用構建器”,其實這裡的構建器就屬於建造者模式,只是裡面把四個角色都放到具體產品裡面了。
上面例子如果只製造男人,演化後如下:
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; }}
測試:
public class Test{ public static void main(String[] args) { ManBuilder builder = new ManBuilder(); Man man = builder.builderMan(); }}
更多設計模式:23種設計模式系列
作者:jason0539
部落格:http://blog.csdn.net/jason0539(轉載請說明出處)
掃碼關注我公眾號