使用場景
– 我們要建造一個複雜的產品。比如:神州飛船,Iphone。這個複雜的產品的創建。有這樣一個問題需要處理:
• 裝配這些子組件是不是有個步驟問題?
– 實際開發中,我們所需要的對象構建時,也非常複雜,有很多步驟需要處理時。
建造者模式的本質
– 分離了對象子組件的單獨構造(由Builder來負責)和裝配(由Director負責)。 從而可以構造出複雜的對象。這個模式適用於:某個對象的構建過程複雜的情況下使用。
– 由於實現了構建和裝配的解耦。不同的構建器,相同的裝配,也可以做出不同的對象;相同的構建器,不同的裝配順序也可以做出不同的對象。
也就是實現了構建算法、裝配算法的解耦,實現了更好的複用
開發中應用場景
- StringBuilder類的append方法
- SQL中的PreparedStatement
- JDOM中,DomBuilder、SAXBuilder
代碼示例
假設建造飛船,則有飛船對象,飛船有自己的屬性
/**
* 宇宙飛船
*/
public class AirShip {
private OrbitalModule orbitalModule;//軌道艙
private Engine engine; //發動機
private EscapeTower escapeTower;//逃逸塔
public void lauch(){
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;
}
}
定義建造者和組裝者,建築者負責裝備返回飛創內部零件,組裝者負責組裝零件,產生飛船。
public interface AirShipBuilder {
Engine builderEngine();
OrbitalModule builderOrbitalModule();
EscapeTower builderEscapeTower();
}
public interface AirShipDirector {
AirShip directAirShip();//組裝飛船
}
裝配者與建造者具體實現
public class SxtAirShipBuilder 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("尚學堂牌逃逸塔");
}
}
public class SxtAirShipDirector implements AirShipDirector {
private AirShipBuilder builder;
public SxtAirShipDirector(AirShipBuilder builder) {
this.builder = builder;
}
@Override
public AirShip directAirShip() {
Engine engine = this.builder.builderEngine();
EscapeTower escapeTower = this.builder.builderEscapeTower();
OrbitalModule orbitalModule = this.builder.builderOrbitalModule();
AirShip ship = new AirShip();
ship.setEngine(engine);
ship.setEscapeTower(escapeTower);
ship.setOrbitalModule(orbitalModule);
return ship;
}
}
代碼調用
public class Client {
public static void main(String[] args) {
SxtAirShipDirector sxtAirShipDirector = new SxtAirShipDirector(new SxtAirShipBuilder());
AirShip ship = sxtAirShipDirector.directAirShip();
System.out.println(ship);
}
}
可以看到,調用者,只需要與裝配者與組裝者打交道,而不需要管飛船內部構建細節,實現瞭解耦。