首页 > 代码库 > (@WhiteTaken)设计模式学习——建造者模式

(@WhiteTaken)设计模式学习——建造者模式

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.不同的工厂对产品属性有不同的创建方法,如果建造者不同,创建的复合对象是不同的。

 

(@WhiteTaken)设计模式学习——建造者模式