文章出處

Builder模式,也就是建造者模式或者生成器模式,是GoF提出的23種設計模式的一種。

這種模式是用來隱式的創建復合對象而提出來的。

創建復合對象的過程,不在主客戶端顯示。

下面直接上代碼。以修建房屋為例子。

1.修建房屋,我們需要實例化一個房子,房子需要能修建門、地板、墻壁等。這時候我們需要有一個房子類。我們需要為其添加get set方法。

 1 /*
 2  * 房子 可以修建門窗、地板、墻
 3  */
 4 public class House {
 5     private String door;
 6     private String floor;
 7     private String wall;
 8     
 9     public String getDoor() {
10         return door;
11     }
12     public void setDoor(String door) {
13         this.door = door;
14     }
15     public String getFloor() {
16         return floor;
17     }
18     public void setFloor(String floor) {
19         this.floor = floor;
20     }
21     public String getWall() {
22         return wall;
23     }
24     public void setWall(String wall) {
25         this.wall = wall;
26     }    
27 }

2.但是我們發現,我們想要修建房子,在主客戶端中我們需要創建一個房子的實例,然后調用其各種set方法,創建這個房子的屬性。這樣確實可以修建一個簡單的房子,但是房子是有不同種類的,比如平房、公寓、寫字樓、住宅等等。

這樣的話,我們需要用盡量簡潔的代碼在主客戶端建造我們的房子。我們把修建房子的工作交給工程隊完成,但是不同的工程隊,修建的房子的類型是不同的。所以我們需要把工程隊抽象成一個接口。

1 /*
2  * 房屋建造者(工程隊) 修建不同的房子 ,建造者不同, 公寓、平房、商業住宅
3  */
4 public interface HouseBuilder {
5     public void makeDoor();
6     public void makeFloor();
7     public void makeWall();
8     public House returnHouse();
9 }

3.能實現這個接口的類,當然就是不同的工程隊啦。我們這時候可以派遣兩個工程隊分別完成公寓和住宅的建造任務。修建完畢需要返回修建好的住宅驗收。

 1 /*
 2  * 修建公寓的建造者,需要實現修建門、地板、墻的方法
 3  */
 4 public class GoogyuBuilder implements HouseBuilder {
 5 
 6     House house =new House();
 7     public void makeDoor() {
 8         house.setDoor("WhiteTaken--公寓--門");    
 9     }
10 
11     public void makeFloor() {
12         house.setFloor("WhiteTaken--公寓--地板");
13     }
14 
15     public void makeWall() {
16         house.setWall("WhiteTaken--公寓--墻");
17     }
18     
19     public House returnHouse(){
20         return house;
21     }
22 }
23 
24 /*
25  * 住宅的建造者需要修建門、地板、墻
26  */
27 public class ZhuzhaiBuilder implements HouseBuilder {
28     
29     House house= new House();
30     
31     public void makeDoor() {
32         house.setDoor("WhiteTaken--住宅--門");
33     }
34 
35     public void makeFloor() {
36         house.setFloor("WhiteTaken--住宅--地板");
37     }
38 
39     public void makeWall() {
40         house.setWall("WhiteTaken--住宅--墻");
41     }
42     
43     public House returnHouse(){
44         return house;
45     }
46 }

4.但是我們只有上邊的這部分還不是特別完美。我們想修建不同的房子,就得去調用不同建造者的make方法。在主客戶端并不是好,因為會寫入重復的代碼。

這是我們可以添加設計師類,設計師可以調用不同的工程隊,完成不同的工作。

 1 /*
 2  * 設計師負責建造房子,建造不同的房子,需要不同的工程隊
 3  */
 4 public class HouseDirector {
 5     public static void SetBuilder(HouseBuilder houseBuilder)
 6     {
 7         houseBuilder.makeDoor();
 8         houseBuilder.makeFloor();
 9         houseBuilder.makeWall();
10     }
11 }

5.好,這時候我們可以在主客戶端建造我們的房子。

 1 public class MainClass {
 2     public static void main(String[] args) {
 3         //HouseBuilder builder=new GoogyuBuilder();//公寓建造者
 4         HouseBuilder builder=new ZhuzhaiBuilder();//住宅建造者
 5         HouseDirector.SetBuilder(builder);//設計師讓建造者建造不同的房屋
 6         House house=builder.returnHouse();//驗收房屋
 7         System.out.println(house.getDoor());
 8         System.out.println(house.getFloor());
 9         System.out.println(house.getWall());
10     }
11 }

打印的結果。

1.當實例化一個公寓建造者,情況如下。

 

2.當實例化一個住宅建造者,情況如下。

 

以上打印過程,我們只需要實例化不同的建造者就可以完成。即在主客戶端中我們僅僅修改了少量的代碼就完成了大部分的工作。極大的提高了效率和可拓展性。

建造者模式在哪里使用?

1.對象的創建,此模式是為對象的創建而設計的模式。

2.創建一個復合對象時可以用到,且創建的過程不需要讓外界知道。

3.不同的工廠對產品屬性有不同的創建方法,如果建造者不同,創建的復合對象是不同的。

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()