首页 > 代码库 > (@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)设计模式学习——建造者模式