创建者模式
场景
- 我们要建造一个复杂的产品,比如:神州飞船、Iphone。这个复杂的产品的创建,有这样一个问题需要处理装配这些字子组件是不是有个步骤问题
- 实际开发中,我们所需要的对象构建是,也非常复杂,有很多步骤需要处理时
建造模式的本质
分离了对象子组件的单独构造(有Builder来负责)和装配(由Director负责)。从而可以构造出复杂的对象,这个模式适用于:某个对象的构建过程复杂的情况下使用
由于实现了构建和装配的解耦,不同的构造器,相同的装配,也可以做出不同的对象;相同的构建起,不同的装配顺序也可以做出不同的对象;也就是实现了构建算法,装配算法的解耦,实现了更好的复用
结构
- Builder 抽象建造者接口,规范各个组成部分的构建。
- ConcreteBuilder 具体建造者角色,实现组成部分的构建,并提供示例。
- Product 产品角色,创建返回的对象。
- Director 导演者角色,负责创建以及使用。
结构图
代码示例
/** * 宇宙飞船 */ public class AirShip { private OrbitalModule orbitalModule ;//轨道舱模块 private Engine engine; //发动机 private EscapePower escapePower; //逃逸塔 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 EscapePower getEscapePower() { return escapePower; } public void setEscapePower(EscapePower escapePower) { this.escapePower = escapePower; } } class OrbitalModule{ String orbitalNme; public OrbitalModule(String orbitalNme) { super(); this.orbitalNme = orbitalNme; } public String getOrbitalNme() { return orbitalNme; } public void setOrbitalNme(String orbitalNme) { this.orbitalNme = orbitalNme; } } class Engine{ private String engineName; public Engine(String engineName) { this.engineName = engineName; } public String getEngineName() { return engineName; } public void setEngineName(String engineName) { this.engineName = engineName; } } class EscapePower{ private String escapePowerName ; public EscapePower(String escapePowerName) { this.escapePowerName = escapePowerName; } public String getEscapePowerName() { return escapePowerName; } public void setEscapePowerName(String escapePowerName) { this.escapePowerName = escapePowerName; } }
/** * 构建子组件 */ public interface AirShipBuilder { Engine builderEgine(); OrbitalModule builderOrbitalModule(); EscapePower builderEscapePower(); } public class SxtAirShipBuilder implements AirShipBuilder { @Override public Engine builderEgine() { System.out.println("构建发动机"); return new Engine("发动机"); } @Override public OrbitalModule builderOrbitalModule() { System.out.println("构建轨道舱模块"); return new OrbitalModule("轨道舱模块"); } @Override public EscapePower builderEscapePower() { System.out.println("构建逃逸塔"); return new EscapePower("逃逸塔"); } }
/** * 装配 */ public interface AirShipDirector { /** * 组装airship * @return */ AirShip directorAirShip(); } /** * 组装宇宙飞船 装备者调用构建者创建对象 */ public class SxtAirShipDirector implements AirShipDirector { AirShipBuilder builder; public SxtAirShipDirector(AirShipBuilder builder) { this.builder = builder; } @Override public AirShip directorAirShip() { Engine engine =builder.builderEgine(); OrbitalModule orbitalModule = builder.builderOrbitalModule(); EscapePower escapePower =builder.builderEscapePower(); //组装 AirShip airShip = new AirShip(); airShip.setEngine(engine); airShip.setEscapePower(escapePower); airShip.setOrbitalModule(orbitalModule); return airShip; } }
public class Client { public static void main(String[] args){ AirShipBuilder builder = new SxtAirShipBuilder(); AirShipDirector director = new SxtAirShipDirector(builder); AirShip ship = director.directorAirShip(); System.out.println(ship.getEngine().getEngineName()); System.out.println(ship.getOrbitalModule().getOrbitalNme()); System.out.println(ship.getEscapePower().getEscapePowerName()); } }
开发中的应用场景
- StringBuilder类的append方法
- SQL中的PrepareStatement
- JDOM中,DomBuilder、SAXBuilder