时间:2022-12-14 10:28:38 | 栏目:JAVA代码 | 点击:次
假如说,我们需要建房子:这一过程为打桩、砌墙、封顶。房子有各种各样的,比如普通房,高楼,别墅,各种房子的过程虽然一样,但是要求不要相同的.3)请编写程序,完成需求。
传统的想法应该就是下面这个类图的形式。.
那么这种写法的优点就是 比较好理解,简单易操作。
缺点则是:设计的程序结构,过于简单,没有设计缓存层对象,程序的扩展和维护不好。也就是说,这种设计方案,把产品(即: 房子)和创建产品的过程(即: 建房子流程)封装在一起,耦合性增强了。
解决方案: 将产品和产品建造过程解耦 => 建造者模式。
而在建造者模式中有四大角色:
如果说将上面盖房子的案例使用建造者模式来解决了话,那么类图就是下面这样。(四大角色都在其中),House类就是具体的产品(我们要盖的房子实体),HouseBuilder则是抽象建造者,具体的建造过程不在它内部实现,而是由它下面的几个子类来完成,这几个子类就是具体建造者(CommonHouse、HighBuilding),指挥者则是HouseDirector,它来负责产品对象的建造过程(我到底要建造哪种类型的房子)。最后的Client则是我们的测试类。
package com.szh.builder; public class House { private String basic; private String wall; private String roof; //setter and getter }
package com.szh.builder; //抽象的建造者 public abstract class HouseBuilder { protected House house = new House(); //将建造的流程写好, 抽象的方法 public abstract void buildBasic(); public abstract void buildWall(); public abstract void buildRoof(); //建造房子好, 将产品(房子)返回 public House buildHouse() { return house; } }
package com.szh.builder; public class CommonHouse extends HouseBuilder { @Override public void buildBasic() { System.out.println(" 普通房子打地基5m.... "); } @Override public void buildWall() { System.out.println(" 普通房子砌墙10cm.... "); } @Override public void buildRoof() { System.out.println(" 普通房子添加屋顶.... "); } }
package com.szh.builder; public class HighHouse extends HouseBuilder { @Override public void buildBasic() { System.out.println(" 高楼打地基100m.... "); } @Override public void buildWall() { System.out.println(" 高楼砌墙20cm.... "); } @Override public void buildRoof() { System.out.println(" 高楼添加透明屋顶.... "); } }
package com.szh.builder; //指挥者,这里去指定制作流程,返回产品 public class HouseDirector { HouseBuilder houseBuilder; //构造器传入 houseBuilder public HouseDirector(HouseBuilder houseBuilder) { this.houseBuilder = houseBuilder; } //通过setter传入 houseBuilder public void setHouseBuilder(HouseBuilder houseBuilder) { this.houseBuilder = houseBuilder; } //如何处理建造房子的流程,交给指挥者 public House constructHouse() { houseBuilder.buildBasic(); houseBuilder.buildWall(); houseBuilder.buildRoof(); return houseBuilder.buildHouse(); } }
package com.szh.builder; public class MainTest { public static void main(String[] args) { //盖普通房子 CommonHouse commonHouse = new CommonHouse(); //准备创建房子的指挥者 HouseDirector houseDirector = new HouseDirector(commonHouse); //完成盖房子,返回产品(普通房子) houseDirector.constructHouse(); System.out.println("--------------------------"); //盖高楼 HighHouse highHouse = new HighHouse(); //重置建造者 houseDirector.setHouseBuilder(highHouse); //完成盖房子,返回产品(高楼) houseDirector.constructHouse(); } }
我们来看StringBuilder这个类,以及它的父类,父类实现的相关接口。