北风设计模式课程---7、建造者模式
一、总结
一句话总结:
设计模式都是对生活中好的做事方法的一些抽象,使得各司其职,减少出错。
建造者模式可以看做模仿的生活中:设计师,施工队做复杂房子交给客户的场景
角色:学设计模式分清角色就很简单了
1、建造者模式是什么?
1、造房子:隐藏复合对象的创建过程
2、不同施工队:把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建
3、用户:用户单纯的从施工队那里接收房子即可
用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。
2、建造者模式实例?
1、房子基类:比如修房子,有房子基类,如果直接让用户修房子的话,修不同的房子修改麻烦
2、施工队:找工程队(接口)来修,如果修平房就找修平房的建造工人(接口实例),如果修楼房就找修楼房的建造工人(接口实例),这些具体的工人要返回实例出去的,修房子的过程就是修改房子基类属性的过程
3、设计师:有设计师角色,设计师角色指导工程队来修房子,设计师里面有工程队的实例,方便指挥工程队做事
3、建造者模式的修房子实例的核心代码示例?
1、找具体工程队:HouseBuilder builder = new GongyuBuilder(); //比如这里修公寓 //由工程队来修
2、设计师指导工程队做:HouseDirector director = new HouseDirector(); director.makeHouse(builder);
3、第二步中可以弄成静态方法来优化一下
4、建造者模式应用场景是什么?
1、创建对象的时候:Builder模式是为对象的创建而设计的模式
2、创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象
3、关注对象创建的各部分的创建过程:不同的工厂(这里指builder生成器)对产品属性有不同的创建方法
5、建造者模式的实质是什么?
施工队:做房子由专门的施工队来做
设计师:施工队怎么做由设计师来指导
用户:直接接收施工队做好的house即可
6、建造者模式的优缺点是什么?
1、方便用户:用户不必关注复杂房子的创建过程,直接从施工队手里拿房子即可
2、不同施工队各司其职:建造不同的房子,或者建造房子中不同的部位,有不同的施工队
7、legend2项目中如何使用建造者模式(比如构建奖励的数据)?
施工队:比如构建奖励的数据,不同的施工队构建不同类型的奖励,比如装备、特性书等
设计师:有一个设计师,来负责指导施工队该怎么做
用户:用户只管得到施工队处理好的数据即可
二、内容在总结中
1、相关知识
2、代码
房子基类:House.java
施工队接口:HouseBuilder.java
平房施工队(实现施工队接口):PingFangBuilder.java:做平房
公寓施工队(实现施工队接口):GongyuBuilder.java:做公寓
设计师:HouseDirector.java:指导具体施工队如何做房子
用户-主类: MainClass.java:获取具体施工队做好的房子
房子基类:House.java
1 /* 2 * ·¿×Ó 3 */ 4 public class House { 5 // µØ°å 6 private String floor; 7 // ǽ 8 private String wall; 9 // Îݶ¥10 private String housetop;11 12 public String getFloor() {13 return floor;14 }15 16 public void setFloor(String floor) {17 this.floor = floor;18 }19 20 public String getWall() {21 return wall;22 }23 24 public void setWall(String wall) {25 this.wall = wall;26 }27 28 public String getHousetop() {29 return housetop;30 }31 32 public void setHousetop(String housetop) {33 this.housetop = housetop;34 }35 36 }
施工队接口:HouseBuilder.java
/* * ¹¤³Ì¶Ó */public interface HouseBuilder { //Ð޵ذå public void makeFloor(); //ÐÞǽ public void makeWall(); //ÐÞÎݶ¥ public void makeHousetop(); public House getHouse();}
平房施工队(实现施工队接口):PingFangBuilder.java:做平房
/* * 平房工程队 */public class PingFangBuilder implements HouseBuilder { House house = new House(); public void makeFloor() { house.setFloor("平房-->地板"); } public void makeHousetop() { house.setHousetop("平房-->房顶"); } public void makeWall() { house.setWall("平房-->墙"); } public House getHouse() { return house; }}
公寓施工队(实现施工队接口):GongyuBuilder.java:做公寓
public class GongyuBuilder implements HouseBuilder{ House house = new House(); public House getHouse() { return house; } public void makeFloor() { house.setFloor("公寓-->地板"); } public void makeHousetop() { house.setHousetop("公寓-->房顶"); } public void makeWall() { house.setWall("公寓-->墙"); } }
设计师:HouseDirector.java:指导具体施工队如何做房子
public class HouseDirector { public void makeHouse(HouseBuilder builder) { builder.makeFloor(); builder.makeWall(); builder.makeHousetop(); } }
用户-主类: MainClass.java:获取具体施工队做好的房子
public class MainClass { public static void main(String[] args) {// //客户直接造房子// House house = new House();// house.setFloor("地板");// house.setWall("墙");// house.setHousetop("屋顶"); //由工程队来修 HouseBuilder builder = new GongyuBuilder(); //设计者来做 HouseDirector director = new HouseDirector(); director.makeHouse(builder); House house = builder.getHouse(); System.out.println(house.getFloor()); System.out.println(house.getWall()); System.out.println(house.getHousetop()); }}