Java設計模式之建造者模式(Builder Pattern)

前言

這篇文章主要向大家講解什麼是建造者模式,建造者模式的實例講解及應用場景等知識點。

一、建造者介紹

​ 用戶可以不知道產品的構建細節直接可以創建複雜的對象,主要是分離了產品的構建和裝配,這樣就實現了構建和裝配的解耦。不同的構建器,相同的裝配,也可以做出不同的對象; 相同的構建器,不同的裝配順序也可以做出不同的對象,這樣就實現了的復用性和。

舉例說明:

比如我們組建一個造飛船和裝配飛船。

  1. 建造者:負責建造飛船(建造過程和細節)
  2. 裝配者:只需要把各個零部件(引擎,軌道窗,發射塔)組裝起來做成一個產品,用戶只需要和裝配者發生關係,獲取到自己想要的產品即可。

image-20200514220858968

說明:

(1)、裝配者(Director)直接和客戶(Client)進行交流;交流後裝配者將客戶創建產品的需求劃分為幾個部分去請求(Builder)去做,

(2)、抽象的建造者(Builder)請求委派到具體的建造者(AirBuilder);各個具體建造者負責進行產品部件的構建;最終構建成具體產品(Product)。

其實很類似蘋果的代工廠
蘋果公司管產品的設計,設計出來的產品,交給中國大陸的代工廠去組裝生產。

二、建造者的實例講解

下面讓我們來做一個具體的實例來講解建造者模式:

飛船實例:

假設飛船(AirShip)由三個零部件組成(引擎,軌道窗,發射塔),那麼這些零部件的創建就交給我們的建造者實現,抽象的建造者(AirShipBuilder)交給具體的建造者(ZgAirShipBuilder)來完成這些零部件的生產。

具體的裝配者(ZgrAirShipDirector)只需要把建造者生產出來的零部件組裝起來,客戶端只需要與裝配者打交道即可。

具體的實現代碼如下:

飛船的組裝零件(Engine,EscapeTower,OrbitaModule)


public 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;
    }
}

public 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 class OrbitaModule {
    private String name;

    public OrbitaModule(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

飛船

/**
 * @author 13394
 */
public class AirShip {
    private EscapeTower escapeTower;
    private Engine engine;
    private OrbitaModule orbitaModule;

    public AirShip(EscapeTower escapeTower, Engine engine, OrbitaModule orbitaModule) {
        this.escapeTower = escapeTower;
        this.engine = engine;
        this.orbitaModule = orbitaModule;
    }

    public EscapeTower getEscapeTower() {
        return escapeTower;
    }

    public void setEscapeTower(EscapeTower escapeTower) {
        this.escapeTower = escapeTower;
    }

    public Engine getEngine() {
        return engine;
    }

    public void setEngine(Engine engine) {
        this.engine = engine;
    }

    public OrbitaModule getOrbitaModule() {
        return orbitaModule;
    }

    public void setOrbitaModule(OrbitaModule orbitaModule) {
        this.orbitaModule = orbitaModule;
    }
}

建造者 (AirShipBuilder,ZgAirShipBuilder)

public interface AirShipBuilder {
    Engine getEngine();
    EscapeTower getEscapeTower();
    OrbitaModule getOrbitaModule();
}

public class ZgAirShipBuilder implements AirShipBuilder {
    @Override
    public Engine getEngine() {
        System.out.println("構造發動機!!!!!!!!!!!!!");
        return new Engine("發動機");
    }

    @Override
    public EscapeTower getEscapeTower() {
        System.out.println("構造逃逸塔!!!!!!!!");
        return new EscapeTower("逃逸塔");
    }

    @Override
    public OrbitaModule getOrbitaModule() {
        System.out.println("構造軌道艙!!!!!!!!!!!!");
        return new OrbitaModule("軌道艙");
    }
}

裝配者(AirShipDirector,ZgrAirShipDirector)

public interface AirShipDirector {
     public AirShip directAirShip();
}

public class ZgrAirShipDirector implements AirShipDirector {
    private AirShipBuilder airShipBuilder;

    public ZgrAirShipDirector(AirShipBuilder airShipBuilder) {
        this.airShipBuilder = airShipBuilder;
    }

    @Override
    public AirShip directAirShip() {
        Engine engine = airShipBuilder.getEngine();
        EscapeTower escapeTower = airShipBuilder.getEscapeTower();
        OrbitaModule orbitaModule = airShipBuilder.getOrbitaModule();
        AirShip airShip = new AirShip(escapeTower, engine, orbitaModule);

        return airShip;
    }
}

客戶端(Client)調用

public class Client {
    public static void main(String[] args) {
        AirShipDirector airShipDirector=new ZgrAirShipDirector(new ZgAirShipBuilder());
        airShipDirector.directAirShip();
    }
}

通過以上這個飛船的例子我相信大家已經明白什麼是建造者模式了吧!!!!!!!!!!

三、建造者模式的應用場景

開發中應用場景:
StringBuilder類的append方法
SQL中的 PreparedStatement
JDOM中DomBuilder、SAXBuilder

四、小結

那麼建造者模式有什麼優點和缺點呢?

優點:

  • 易於解耦
    將產品本身與產品創建過程進行解耦,可以使用相同的創建過程來得到不同的產品。也就說細節依賴抽象。
  • 易於精確控制對象的創建
    將複雜產品的創建步驟分解在不同的方法中,使得創建過程更加清晰
  • 易於拓展
    增加新的具體建造者無需修改原有類庫的代碼,易於拓展,符合「開閉原則「。

缺點:

  • 如果產品足夠複雜的話,那我們的建造者創建的越多,會造成龐大的類,不利於管理。

請幫忙點個贊,因為你的鼓勵是我創作最大的動力!