一.场景
- 我们要建造一个复杂的产品,比如手机、电脑、汽车。这个复杂的产品的创建。有这样一个问题需要处理:
- 装配这些子组件是不是有个步骤问题?
- 实际开发中,我们所需要的对象构建时,也非常复杂,有很多步骤需要处理时。
二.本质
- 分离了对象子组件的单独构造(Builder来负责)和装配(由Director负责)。从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况下使用。
- 由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。也就实现了构建算法、装配算法的解耦,实现了更换的复用。
三.举例实现
package hs.builder;
/**
* 对象 XX牌飞船
*/
public class AirShip {private OrbitalModule orbitalModule;//轨道舱private EscpeTower escpeTower;//逃逸塔private Engine engine; //引擎 /*** 可以构建自己的方法*/public void lunch(){System.out.println("发射。。。。。。。");}public OrbitalModule getOrbitalModule() {return orbitalModule;}public EscpeTower getEscpeTower() {return escpeTower;}public Engine getEngine() {return engine;}public void setOrbitalModule(OrbitalModule orbitalModule) {this.orbitalModule = orbitalModule;}public void setEscpeTower(EscpeTower escpeTower) {this.escpeTower = escpeTower;}public void setEngine(Engine engine) {this.engine = engine;}
}/**
* 飞船的轨道舱 对象
*/
public class OrbitalModule{private String name;public OrbitalModule() {}public OrbitalModule(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}/**
* 飞船的逃逸塔 对象
*/
public class EscpeTower{private String name;public EscpeTower() {}public EscpeTower(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}/**
* 飞船的引擎 对象
*/
public class Engine{private String name;public Engine() {}public Engine(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}
-
- 构建飞船组件接口与实现类
/*** 构建 飞船的组件 接口*/
public interface AirShipBuilder {OrbitalModule builderOrbitalModule(); EscpeTower builderEscpeTower();Engine builderEngine();
}
/*** 构建 飞船的组件 对象*/
public class HisAirShipBuilder implements AirShipBuilder {@Overridepublic OrbitalModule builderOrbitalModule() {System.out.println("构建神州牌轨道舱。。。。");return new OrbitalModule("神州牌轨道舱");}@Overridepublic EscpeTower builderEscpeTower() {System.out.println("构建神州牌逃逸塔。。。。");return new EscpeTower("神州牌逃逸塔");}@Overridepublic Engine builderEngine() {System.out.println("构建神州牌引擎。。。。");return new Engine("神州牌引擎");}
}
-
- 组装飞船对象接口和实现类
/**
* 组装 飞船对象 接口
*/
public interface AirShipDirector {AirShip directorAirShip();
}
/**
* 组装 飞船对象
*/
public class HisAirShipDirector implements AirShipDirector{private AirShipBuilder builder;public HisAirShipDirector(AirShipBuilder builder) {this.builder=builder;}@Overridepublic AirShip directorAirShip() {OrbitalModule o=builder.builderOrbitalModule();EscpeTower e=builder.builderEscpeTower();Engine en=builder.builderEngine();//装配成飞船对象AirShip ship=new AirShip();ship.setOrbitalModule(o);ship.setEscpeTower(e);ship.setEngine(en);return ship;}
}
-
- 使用者调用
/**
* 建造者模式
*/
public static void main(String[] args) {AirShipDirector director =new HisAirShipDirector(new HisAirShipBuilder());AirShip ship= director.directorAirShip();//可以调用AirShip里构建的方法(AirShip里可以构建各种指令方法)ship.lunch();System.out.println(ship.getOrbitalModule().getName());
}
更多设计模式学习:
设计模式(1):介绍
设计模式(2):单例模式
设计模式(3):工厂模式
设计模式(5):原型模式
设计模式(6):桥接模式
设计模式(7):装饰器模式
设计模式持续更新中…