场景:
我们需要建造一个复杂的产品。比如:神舟飞船、iphone。这些复杂的产品创建。有这样一个问题需要处理:装配这些子组件是不是有个步骤问题?
在实际开发中,什么所需要的对象构建时,也非常复杂,有很多步骤需要处理时。
建造模式的本质:
分离了对象子组件的单独构造(由Builder来负责)和装配(由Director负责)。从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况下使用。
由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法与装配算法的解耦,实现了更好的复用。
下面用建造飞船的例子来说明:
//创建飞船类和对应的模块类
package com.note.pattern.build; //飞船类 public class AirShip { private OrbitalModule orbitalModule;// 轨道舱 private Engine engine;// 发动机 private EscapeTower escapeTower;// 逃逸塔 public void launch() { System.out.println("发射!"); } public OrbitalModule getOrbitalModule() { return orbitalModule; } public void setOrbitalModule(OrbitalModule orbitalModule) { this.orbitalModule = orbitalModule; } public Engine getEngine() { return engine; } public void setEngine(Engine engine) { this.engine = engine; } public EscapeTower getEscapeTower() { return escapeTower; } public void setEscapeTower(EscapeTower escapeTower) { this.escapeTower = escapeTower; } } // 轨道舱类 class OrbitalModule { private String name; public OrbitalModule(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } } // 发动机类 class Engine { private String name; public Engine(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } } // 逃逸塔类 class EscapeTower { private String name; public EscapeTower(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
//创建Builder接口与其实现类
package com.note.pattern.build; public interface AirShipBuilder { OrbitalModule buildOrbitalModule(); Engine buildEngine(); EscapeTower buildEscapeTower(); }
package com.note.pattern.build; public class ChinaAirShipBuild implements AirShipBuilder{ @Override public OrbitalModule buildOrbitalModule() { System.out.println("构建中国牌轨道舱!"); return new OrbitalModule("中国牌轨道舱"); } @Override public Engine buildEngine() { System.out.println("构建中国牌发动机!"); return new Engine("中国牌发动机"); } @Override public EscapeTower buildEscapeTower() { System.out.println("构建中国牌逃逸塔!"); return new EscapeTower("中国牌逃逸塔"); } }
//创建Director接口与实现类,负责组装:
package com.note.pattern.build; public interface AirShipDirector { //组装飞船对象 AirShip directAirShip(); }
package com.note.pattern.build; public class ChinaAirShipDirector implements AirShipDirector{ private AirShipBuilder builder; public ChinaAirShipDirector(AirShipBuilder builder) { this.builder = builder; } @Override public AirShip directAirShip() { Engine e = builder.buildEngine(); OrbitalModule o = builder.buildOrbitalModule(); EscapeTower et = builder.buildEscapeTower(); //装配成飞船对象 AirShip ship = new AirShip(); ship.setEngine(e); ship.setEscapeTower(et); ship.setOrbitalModule(o); return ship; } }
//客户端使用
package com.note.pattern.build; public class Client { public static void main(String[] args) { AirShipDirector director = new ChinaAirShipDirector(new ChinaAirShipBuild()); AirShip airShip = director.directAirShip(); System.out.println(airShip.getEngine().getName()); airShip.launch(); } }
开发中应用场景:
StringBuild类的append方法
Sql中的PreparedStatement
JDOM中,DomBuilder、SAXBuilder