1. 程式人生 > 其它 >學習筆記【23種設計模式-第五節:建造者模式】

學習筆記【23種設計模式-第五節:建造者模式】

技術標籤:# 23種設計模式java設計模式

建造者模式

簡述:

建造者模式又叫生成器模式 ,是一種物件構建模式,它可以將複雜的建造過程抽象出來,使這個抽象過程的不同實現方式可以構造出不同表現(屬性)的物件。

  • 建造者模式 使一步一步建立一個複雜的物件,它允許使用者只通過指定複雜物件的型別和內容就可以構建他們,使用者不需要知道內部的具體構造細節。

建造者模式的四個角色

  • Product(產品角色) :一個具體的產品物件。
  • Builder (抽象建造者) :建立一個Product物件的各個部件指定的介面。
  • ConcreteBuilder(具體建造者) :實現介面,狗i按和裝配各個部件。
  • Director(指揮者)
    :構建一個使用Builder介面的物件。它主要是用於建造一個複雜的物件,他主要有兩個作用:① 隔離了客戶與物件的生產過程;② 複雜控制產品物件的生產過程。

建房子

House(Product):

public class House {//->product
    private String basic;
    private String wall;
    private String roofed;
    
    public String getBaise() {
        return basic;
    }
    public void setBaise(String baise)
{ this.basic = baise; } public String getWall() { return wall; } public void setWall(String wall) { this.wall = wall; } public String getRoofed() { return roofed; } public void setRoofed(String roofed) { this.roofed = roofed; }
}

HouseBuilder(抽象建造者):

public abstract class HouseBuilder {
    protected House house=new House();
    public abstract void buildBasic();
    public abstract void buildWalls();
    public abstract void buildRoofed();

    public House buildHouse(){
        return house;
    }
}

CommonHouse(具體建造者1):

public class CommonHouse extends HouseBuilder {
    @Override
    public void buildBasic() {
        System.out.println("普通房子打地基5米");
    }

    @Override
    public void buildWalls() {
        System.out.println("普通房子砌牆10cm");
    }

    @Override
    public void buildRoofed() {
        System.out.println("普通房子蓋屋頂");
    }
}

HighBuilding(具體建造者2):

public class HighBuilding extends HouseBuilder{
    @Override
    public void buildBasic() {
        System.out.println("高樓打地基100米");
    }

    @Override
    public void buildWalls() {
        System.out.println("高樓砌牆20cm");
    }

    @Override
    public void buildRoofed() {
        System.out.println("高樓的透明屋頂");
    }
}

HouseDirector(指揮者):

public class HouseDirector {
    HouseBuilder houseBuilder;

    //通過構造器
    public HouseDirector(HouseBuilder houseBuilder) {
        this.houseBuilder = houseBuilder;
    }

    //通過set
    public void setHouseBuilder(HouseBuilder houseBuilder) {
        this.houseBuilder = houseBuilder;
    }

    public House constructHouse(){
        houseBuilder.buildBasic();
        houseBuilder.buildWalls();
        houseBuilder.buildRoofed();
        return houseBuilder.buildHouse();
    }
}

Client方法:

public class Client {
    public static void main(String[] args) {
        CommonHouse commonHouse=new CommonHouse();
        HouseDirector houseDirector=new HouseDirector(commonHouse);
        House house=houseDirector.constructHouse();

        System.out.println("----------------");

        HighBuilding highBuilding=new HighBuilding();
        houseDirector.setHouseBuilder(highBuilding);
        House house1=houseDirector.constructHouse();
    }
}

結果:

在這裡插入圖片描述


StringBuilder的原始碼體現的也是建造者模式

  • Appendable介面定義了多個append方法(抽象方法),即Appendable就像抽象建造者,定義了抽象方法。
  • AbstractStringBulider實現了Appendable介面的方法,這裡的AbstractStringBulider其實已經是一個建造者,只不過不能例項化(因為它是抽象的)。
  • StringBuilder即充當了指揮者,同時充當了具體的建造者,建造方法的實現是由AbstractStringBulider實現的,只不過StringBuilder繼承了AbstractStringBulider。

注意事項:

  • 客戶端(實用程式)不必知道產品內部組成的細節,將本產品本身與產品的建立過程解耦,使得相同的建立過程可以建立不同的產品物件。
  • 每一個具體建造者都是相對獨立,與其他的具體建造者無關,因此可以很方便的替換具體建造者或者增加新的具體建造者,使用者使用不同的具體建造者即可得到不同的產品物件。
  • 可以更加精細的控制產品的建立過程。將複雜的產品的建立不走分解在不同的方法中,使得建立過程更加的清晰,也更方便實用程式來控制建立過程。
  • 增加新的具體建造者無需修改原有 類庫的程式碼,指揮者類針對抽象建造者程式設計,系統擴充套件方便,符合OCP原則。
  • 建造者模式所建立的產品一般具有較多的共同點,其他組成部分相似,如果產品之間的差異性很大,則不適合使用創造者模式,因此其適用範圍受到一定的限制。
  • 如果產品的內部變化複雜,可能導致需要定義很多具體創造者類來實現這種變化,導致系統變得很龐大,這時要考慮是否選擇建造者模式。
  • 抽象工廠模式vs建造者模式: 抽象工廠模式實現對產品家族的常見,一個產品家族是這樣的一系列產品:具有不同分類維度的產品組合,採用抽象工廠模式不需要關心建立構建過程,只關心產品有什麼工廠生產即可。而建造者模式則是要求按照指定的藍圖建造產品,它的主要目的是通過組裝零配件而產生一個新產品。