建立型模式——建造者模式

pszh發表於2016-07-05

1.由來

在開發中經常有些複雜的物件,它們擁有一系列成員屬性,這些成員屬性中有些是引用型別的成員物件。而且在這些複雜物件中,通過不同的屬性生成

不同的物件;(比如:汽車 這個物件,通過不同的發動機製造出來之後,都是汽車 ,但是他的效能,價格是不同的)


2.定義

建造者模式(Builder Pattern):將一個複雜的物件的構建過程與它的表示分離,使得同樣的構建過程可以建立不同的表示。

例:(汽車的生成過程和他的成品展現分開來,同樣的流程去生產,可以得到不同型號的汽車)

3.程式碼的實現

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

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

ConcreteBuilder  1:
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  2:
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());  
     }  
}  




4.模式的優點

  • 在建造者模式中, 客戶端不必知道產品內部組成的細節,將產品本身與產品的建立過程解耦,使得相同的建立過程可以建立不同的產品物件
  • 每一個具體建造者都相對獨立,而與其他的具體建造者無關,因此可以很方便地替換具體建造者或增加新的具體建造者, 使用者使用不同的具體建造者即可得到不同的產品物件 。
  • 可以更加精細地控制產品的建立過程 。將複雜產品的建立步驟分解在不同的方法中,使得建立過程更加清晰,也更方便使用程式來控制建立過程。
  • 增加新的具體建造者無須修改原有類庫的程式碼,指揮者類針對抽象建造者類程式設計,系統擴充套件方便,符合“開閉原則”

5.模式的缺點

  • 建造者模式所建立的產品一般具有較多的共同點,其組成部分相似,如果產品之間的差異性很大,則不適合使用建造者模式,因此其使用範圍受到一定的限制。
  • 如果產品的內部變化複雜,可能會導致需要定義很多具體建造者類來實現這種變化,導致系統變得很龐大

6.應用場景

  • 需要生成的產品物件有複雜的內部結構,這些產品物件通常包含多個成員屬性。
  • 需要生成的產品物件的屬性相互依賴,需要指定其生成順序。
  • 物件的建立過程獨立於建立該物件的類。在建造者模式中引入了指揮者類,將建立過程封裝在指揮者類中,而不在建造者類中。
  • 隔離複雜物件的建立和使用,並使得相同的建立過程可以建立不同的產品。

參考部落格:

相關文章