GOF23设计模式之建造者模式
场景:
我们要建造一个复杂的产品。比如:神州飞船,Iphone。这个复杂的产品的创建。有这样的一个问题需要处理:
装配这些子组件是不是有个步骤问题?
实际开发中,我们所需要的对象构建时,也非常复杂,有很多步骤需要处理时。
本质:
1)分离了对象子组件的单独构造(由 Builder 来负责)和装配(由 Director 负责)。从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况下使用。
2)由于时下按了构建和装配的解耦。不同的构建起,相同的装配,也可以做出不同的对象;相同的构建起,不同的装配顺序也可以做出不同的对象。也就算实现了构建算法、装配算法的解耦,实现了更好的复用。
package cn.taosir.design.create.builders; /** * 宇宙飞船 * @author taosir * */ public class AirShip { private OrbitalModule orbitalModule;//轨道舱 private Engine engine;//发动机 private EscapeTower escapeTower;//逃逸塔 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) {super();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) {super();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) {super();this.name = name;} public String getName() {return name;} public void setName(String name) {this.name = name;} }
package cn.taosir.design.create.builders; public interface AirShipBuilder { Engine builderEngine(); OrbitalModule builderOrbitalModule(); EscapeTower builderEscapeTower(); }
package cn.taosir.design.create.builders; public interface AirShipDirector { /** * 组装飞船对象 * @return */ AirShip directAirShip(); }
package cn.taosir.design.create.builders; public class TaoSirAirShipBuilder implements AirShipBuilder{ @Override public Engine builderEngine() { System.out.println("构建发动机..."); return new Engine("发动机"); } @Override public OrbitalModule builderOrbitalModule() { System.out.println("构建轨道舱..."); return new OrbitalModule("轨道舱"); } @Override public EscapeTower builderEscapeTower() { System.out.println("构建逃逸塔..."); return new EscapeTower("逃逸塔"); } }
package cn.taosir.design.create.builders; public class TaoSirAirShipDirector implements AirShipDirector{ private AirShipBuilder builder; public TaoSirAirShipDirector(AirShipBuilder builder) { this.builder=builder; } @Override public AirShip directAirShip() { Engine e=builder.builderEngine(); OrbitalModule o=builder.builderOrbitalModule(); EscapeTower et=builder.builderEscapeTower(); //装配飞船对象 AirShip ship=new AirShip(); ship.setEngine(e); ship.setEscapeTower(et); ship.setOrbitalModule(o); return ship; } }
package cn.taosir.design.create.builders; public class Client { public static void main(String[] args) { AirShipDirector director=new TaoSirAirShipDirector(new TaoSirAirShipBuilder()); AirShip ship = director.directAirShip(); System.out.println(ship.getEngine()); } }
开发中的应用场景
StringBuilder类的append方法
SQL中的PreparedStatement
JDOM中,DomBuilder、SAXBuilder