天天看點

5.建造者模式

目錄

簡介

四個角色

應用場景

實作步驟

和工廠模式的差別

簡介

建造者模式也叫生成器模式,是一種對象構模組化式;它可以把複雜對象的建造過程抽象出來(抽象類别),使這個抽象過程的不同實作方法可以構造出不同表現(屬性)的對象;建造者模式是一步一步建立一個複雜的對象,它允許使用者隻通過指定複雜對象的類型和内容,就可以建構它們,使用者不需要知道内部的具體建構細節;

四個角色

1. Product(産品角色):一個具體的産品對象

2. Builder(抽象建造者):建立一個 Product 對象的各個部件指定的接口/抽象類

3. ConcreteBuilder(具體建造者):實作接口,建構和裝配各個部件

4. Director(指揮者):建構一個實用 Builder 接口的對象;它主要是用于建立一個複雜的對象,它主要有兩個作用:隔離了客戶和對象的生産過程;負責控制産品對象的生産過程

應用場景

  • 相同的方法,不同的執行順序,産生不同的結果
  • 多個部件或零件,都可以裝配到對象中,但是産生的結果不同
  • 産品類非常複雜,或者産品類中不同的調用順序産生不同的結果
  • 初始化一個對象特别複雜,參數多,而且很多參數都具有預設值

實作步驟

這裡以建造房屋為例,建造房屋分為 3 個步驟:打地基,建牆,封頂

1. 建立 House.class,即産品角色

/**
 * 房子類
 */
public class House {
    // 地基
    private String foundation;
    // 牆
    private String wall;
    // 屋頂
    private String roof;
    public String getFoundation() {
        return foundation;
    }
    public void setFoundation(String foundation) {
        this.foundation = foundation;
    }
    public String getWall() {
        return wall;
    }
    public void setWall(String wall) {
        this.wall = wall;
    }
    public String getRoof() {
        return roof;
    }
    public void setRoof(String roof) {
        this.roof = roof;
    }
}
           

2. 建立 HouseBuilder.class,這是一個抽象類,定義了建造房屋的基本流程和規範

/**
 * 房屋建造指揮者, 指定建房流程
 */
public abstract class HouseBuilder {
    protected House house = new House();
    // 打地基
    public abstract void buildFoundation();
    // 建牆
    public abstract void buildWall();
    // 封頂
    public abstract void buildRoof();
    // 建房流程
    public House buildHouse() {
        return house;
    }
}
           

3. 建立 VillaHouseBuilder.class,繼承 HouseBuilder.class,實作具體的别墅建造過程

/**
 * 别墅類-實際房子建造
 */
public class VillaHouse extends HouseBuilder {
    @Override
    public void buildFoundation() {
        house.setFoundation("别墅-地基30米");
    }
    @Override
    public void buildWall() {
        house.setWall("别墅-磚牆");
    }
    @Override
    public void buildRoof() {
        house.setRoof("别墅-瓦頂");
    }
}
           

4. 建立 HouseDirector.class,指揮者,負責具體的建立 house 的過程

/**
 * 指揮者, 控制房子建立流程
 */
public class HouseDirector {
    private HouseBuilder houseBuilder;
    public HouseBuilder getHouseBuilder() {
        return houseBuilder;
    }
    public void setHouseBuilder(HouseBuilder houseBuilder) {
        this.houseBuilder = houseBuilder;
    }
    // 具體建造過程
    public House constractVillaHouse() {
        houseBuilder.buildFoundation();
        houseBuilder.buildWall();
        houseBuilder.buildRoof();
        return houseBuilder.buildHouse();
    }
}
           

5. 測試一下對象的建立

public static void main(String[] args) {
    VillaHouse villaHouse = new VillaHouse();
    HouseDirector houseDirector = new HouseDirector();
    houseDirector.setHouseBuilder(villaHouse);

    House house = houseDirector.constractVillaHouse();
    System.out.println("别墅建造資訊: ");
    System.out.println(house.getFoundation());
    System.out.println(house.getWall());
    System.out.println(house.getRoof());
}
           

其實觀察上面的代碼,我們發現,建造者模式主要是把對象的建立過程分離了,建立和表示分離;如果我們需要建立不同的對象,隻需再建立建造者和指揮者即可;如果建造的流程有變化,我們也隻需要調整指揮者即可;這在一定程度上帶來了代碼的臃腫,但達到了解耦的效果,是以這種模式适合建立複雜的對象

和工廠模式的差別

  • 建造者模式更加注重方法的調用順序,工廠模式注重建立對象
  • 建立對象的力度不同,建造者模式建立複雜的對象,由各種複雜的部件組成,而工廠模式建立的對象都一樣
  • 關注點不一樣,工廠模式隻需要把對象建立出來就可以了,而建造者模式不僅要建立出對象,還要關注對象由哪些部件組成
  • 建造者模式根據建造過程中的順序不一樣,可以建立各種不同的對象

繼續閱讀