赞
踩
传统方式
public abstract class AbsHouse { protected abstract void piling(); protected abstract void walling(); protected abstract void capping(); public void build() { piling(); walling(); capping(); } } public class NormalRoom extends AbsHouse { @Override protected void piling() { System.out.println("普通房打桩..."); } @Override protected void walling() { System.out.println("普通房砌墙..."); } @Override protected void capping() { System.out.println("普通房封顶..."); } } public class HighRise extends AbsHouse { @Override protected void piling() { System.out.println("高楼打桩..."); } @Override protected void walling() { System.out.println("高楼砌墙..."); } @Override protected void capping() { System.out.println("高楼封顶..."); } } public class Villa extends AbsHouse { @Override protected void piling() { System.out.println("别墅打桩..."); } @Override protected void walling() { System.out.println("别墅砌墙..."); } @Override protected void capping() { System.out.println("别墅封顶..."); } }
问题分析
Product
(产品角色):一个具体的产品对象Builder
(抽象建造者):可建一个 Product 对象的各个部件指定的接口 / 抽象类ConcreteBuilder
(具体建造者):实现接口,构建和装配各个部件Director
(指挥者):构建一个使用 Builder 接口的对象。它主要是用于创建一个复杂的对象。它主要有两个作用
需要建房子:这一过程为打桩、砌墙、封顶。不管是普通房子也好,别墅也好都需要经历这些过程,下面我们使用建造者模式(Builder Pattern)来完成
UML 类图
//产品角色 public class House { private String pile; private String wall; private String roof; public String getPile() { return pile; } public void setPile(String pile) { this.pile = pile; } 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; } } //抽象建造者 public abstract class HouseBuilder { private House house = new House(); public abstract void piling(); public abstract void walling(); public abstract void capping(); public House build() { return house; } } //具体建造者1 public class NormalRoomBuilder extends HouseBuilder { @Override public void piling() { System.out.println("普通房打桩..."); } @Override public void walling() { System.out.println("普通房砌墙..."); } @Override public void capping() { System.out.println("普通房封顶..."); } } //具体建造者2 public class HighRiseBuilder extends HouseBuilder { @Override public void piling() { System.out.println("高楼打桩..."); } @Override public void walling() { System.out.println("高楼砌墙..."); } @Override public void capping() { System.out.println("高楼封顶..."); } } //具体建造者3 public class VillaBuilder extends HouseBuilder { @Override public void piling() { System.out.println("别墅打桩..."); } @Override public void walling() { System.out.println("别墅砌墙..."); } @Override public void capping() { System.out.println("别墅封顶..."); } } //指挥者 public class HouseDirector { private HouseBuilder houseBuilder; public HouseDirector() { } public void setHouseBuilder(HouseBuilder houseBuilder) { this.houseBuilder = houseBuilder; } public House buildHouse() { houseBuilder.piling(); houseBuilder.walling(); houseBuilder.capping(); return houseBuilder.build(); } } public class BuilderTest { public static void main(String[] args) { HouseDirector houseDirector = new HouseDirector(); House house; houseDirector.setHouseBuilder(new NormalRoomBuilder()); house = houseDirector.buildHouse(); houseDirector.setHouseBuilder(new HighRiseBuilder()); house = houseDirector.buildHouse(); houseDirector.setHouseBuilder(new VillaBuilder()); house = houseDirector.buildHouse(); } }
java.lang.StringBuilder
中的建造者模式
角色分析
Appendable
接口定义了多个append方法(抽象方法),即Appendable
为抽象建造者,定义了抽象方法AbstractStringBuilder
实现了Appendable
接口方法,这里的AbstractStringBuilder
已经是建造者,只是不能实例化StringBuilder
既充当了指挥者角色,又充当了具体的建造者,建造方法的实现是由AbstractStringBuilder
完成,StringBuilder
继承了AbstractStringBuilder
抽象工厂模式实现对产品家族的创建,一个产品家族是这样的一系列产品:具有不同分类维度的产品组合,采用抽象工厂模式不需要关心构建过程,只关心什么产品由什么工厂生产即可。
而建造者模式则是要求按照指定的蓝图建造产品,它的主要目的是通过组装零配件而产生一个新产品
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。