一、什么是建造者模式
Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种。
Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建
过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。
二、建造者模式结构
其中建造者时一个公共接口,提供构造的方法;具体的建设者实现建设者接口,提供一个全局的获取建设者的方法;
设计者Director需要提供一个建造者实例,以及一个具体的建造方法;最终产品由具体的建造者来提供。
三、建造者模式应用的场景
1)对象的创建:Builder模式是为对象的创建而设计的模式
2)创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象
3)关注对象创建的各部分的创建过程:不同的工厂(这里指builder生成器)对产品属性有不同的创建方法
四、代码实现实例
目标:建造房子
首先提供一个房子类及其相关的属性
public class House { private String floor;//地板 private String wall;//墙 private String roof;//屋顶 public String getFloor() { return floor; } public void setFloor(String floor) { this.floor = floor; } public String getWall() { return wall; } public void setWall(String wall) { this.wall = wall; } public String getRoof() { return roof; } public void setRoof(String roof) { this.roof = roof; } @Override public String toString() { return "House{" + "floor='" + floor + '\'' + ", wall='" + wall + '\'' + ", roof='" + roof + '\'' + '}'; } }
设计实现一个房屋的建造者(接口-----》施工队伍)
/** * 房屋构造工程队 */ public interface HouseBuilder { public void makeFloor(); public void makeWall(); public void makeRoof(); public House getHouse(); }
我们将要修改一个瓦房:
package com.dzg.learn.builder; /** * 瓦房构造工程队 */ public class WaFangBuilder implements HouseBuilder{ House house = new House(); public void makeFloor() { house.setFloor("瓦房-->地板"); } public void makeWall() { house.setWall("瓦房--》墙"); } public void makeRoof() { house.setRoof("瓦房--》房顶"); } public House getHouse() { return house; } }
package com.dzg.learn.builder; 提供一个设计师来设计如何构造房子: /** * 房屋设计师 */ public class HouseDirector {/* private HouseBuilder houseBuilder; public HouseDirector(HouseBuilder houseBuilder) { this.houseBuilder = houseBuilder; }*/public void makeHouse(HouseBuilder houseBuilder){ houseBuilder.makeFloor(); houseBuilder.makeWall(); houseBuilder.makeRoof(); } }
然后只需要,设计师让施工队对房子进行相应的构造实现即可
public class TestBuilder { public static void main(String[] args) { HouseBuilder houseBuilder = new WaFangBuilder();//工程队 /* 当需要修改其他的房子时,只需要添加一个新的Builder 例如,当需要对楼房进行修改时,只需要添加一个BuildingBuilder类,实现时只需要修改new BuildingBuilder();即可 */ HouseDirector houseDirector = new HouseDirector();//设计师对房屋进行设计 houseDirector.makeHouse(houseBuilder);//设计师调用叫工程队来构造房子 House house = houseBuilder.getHouse();//获得一个房子 System.out.println(house.toString());//工程队施工 } }
House{floor='瓦房-->地板', wall='瓦房--》墙', roof='瓦房--》房顶'}
注:对于房屋的属性,可以是复合属性
比如对于Floor可以提供两个选择:大理石或磨砂,toString方法中需要对所要获得的地板样式进行判断
public String toString() { if(floor.getDalishi()==null) return "House{" + "floor='" + floor.getMosha()+'\'' + ", wall='" + wall + '\'' + ", roof='" + roof + '\'' + '}'; else{ return "House{" + "floor='" + floor.getDalishi()+'\'' + ", wall='" + wall + '\'' + ", roof='" + roof + '\'' + '}'; } }
在瓦房建造者中,对瓦房屋顶的实现进行更改
public void makeFloor() { Floor floor1 = new Floor(); floor1.setMosha("磨砂"); house.setFloor(floor1); //house.setFloor("瓦房-->地板"); }