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.不同的工廠對產品屬性有不同的創建方法,如果建造者不同,創建的復合對象是不同的。
文章列表