設(shè)計(jì)模式之建造者模式

什么是建造者模式
  1. 建造者模式又叫生成器模式, 是一種對象構(gòu)建模式
  2. 可以將復(fù)雜對象的構(gòu)建過程抽象出來, 使這個(gè)抽象過程的不同實(shí)現(xiàn)方法可以構(gòu)造出不同表現(xiàn)的對象
  • 建造者模式有4個(gè)角色
    Product(產(chǎn)品): 具體的產(chǎn)品對象
    Builder(抽象建造者): 創(chuàng)建一個(gè)Product對象的各個(gè)部件指定的接口或抽象類
    ConcreteBuilder(具體建造者): 實(shí)現(xiàn)接口, 構(gòu)建和裝配各個(gè)部件
    Director(指揮者): 構(gòu)建一個(gè)使用Builder接口的對象。隔離了客戶與對象的生產(chǎn)過程,同時(shí)負(fù)責(zé)控制產(chǎn)品對象的生產(chǎn)過程
案例需求
  1. 建房子, 打地基、切墻、封頂?shù)攘鞒?/li>
  2. 房子分普通房子、高樓等
  • 傳統(tǒng)方式實(shí)現(xiàn)
/**
 * 抽象的建造者
 */
public abstract class HouseBuilder {

    //打地基
    public abstract void buildBase();
    //砌墻
    public abstract void buildWall();
    //封頂
    public abstract void buildRoofed();

    //建房
    public void buildHouse(){
        buildBase();
        buildWall();
        buildRoofed();
    }
}
/**
 * 普通房子
 */
public class CommonHouse extends HouseBuilder {
    @Override
    public void buildBase() {
        System.out.println("普通房子打地基");
    }

    @Override
    public void buildWall() {
        System.out.println("普通房子砌墻");
    }

    @Override
    public void buildRoofed() {
        System.out.println("普通房子封頂");
    }
}
# 測試
public static void main(String[] args) {
    CommonHouse commonHouse = new CommonHouse();
    commonHouse.buildHouse();
}

# 輸出
普通房子打地基
普通房子砌墻
普通房子封頂

分析: 這種方式比較好理解,但是擴(kuò)展和維護(hù)性不好,把房子和創(chuàng)建房子的過程封裝在一起,耦合性太高。

  • 建造者模式實(shí)現(xiàn)
# 產(chǎn)品
public class House {
    private String base;
    private String wall;
    private String roofed;
    // getter、setter和toString方法省略
}
/**
 * 抽象的構(gòu)建者
 */
public abstract class HouseBuilder {
    protected House house = new House();
    //抽象方法
    public abstract void buildBase();
    public abstract void buildWall();
    public abstract void buildRoofed();
    //構(gòu)建房子
    public House buildHouse(){
        return house;
    }
}
/**
 * 具體構(gòu)建者
 * 修建普通房子
 */
public class CommonHouse extends HouseBuilder {
    @Override
    public void buildBase() {
        house.setBase("普通房子打地基");
    }

    @Override
    public void buildWall() {
        house.setWall("普通房子砌墻");
    }

    @Override
    public void buildRoofed() {
        house.setRoofed("普通房子封頂");
    }
}
/**
 * 指揮者
 */
public class HouseDirector {

    HouseBuilder houseBuilder = null;

    public HouseDirector(HouseBuilder houseBuilder) {
        this.houseBuilder = houseBuilder;
    }

    public House createHouse(){
        houseBuilder.buildBase();
        houseBuilder.buildWall();
        houseBuilder.buildRoofed();
        return houseBuilder.buildHouse();
    }
}
# 測試
public static void main(String[] args) {
    HouseDirector houseDirector = new HouseDirector(new CommonHouse());
    House house = houseDirector.createHouse();
    System.out.println(house);
}
輸出:
House{base='打地基', wall='砌墻', roofed='封頂'}

如果我們要新增別墅類型的房子,怎么增加?
只需要增加具體構(gòu)建者VillaHouse類

/**
 * 具體構(gòu)建者
 * 修建別墅
 */
public class VillaHouse extends HouseBuilder{
    @Override
    public void buildBase() {
        house.setBase("別墅打地基");
    }

    @Override
    public void buildWall() {
        house.setWall("別墅砌墻");
    }

    @Override
    public void buildRoofed() {
        house.setRoofed("別墅封頂");
    }
}
public static void main(String[] args) {

    HouseDirector houseDirector = new HouseDirector(new VillaHouse());
    House house = houseDirector.createHouse();
    System.out.println(house);
}
輸出:
House{base='別墅打地基', wall='別墅砌墻', roofed='別墅封頂'}
  • 建造者模式注意事項(xiàng)和細(xì)節(jié)
    1.客戶端不必知道產(chǎn)品內(nèi)部組成的細(xì)節(jié),將產(chǎn)品本身和產(chǎn)品的創(chuàng)建過程解耦,使用相同的創(chuàng)建過程即可創(chuàng)建不同的產(chǎn)品對象
    2.每一個(gè)創(chuàng)建者都是獨(dú)立,與其他創(chuàng)建者無關(guān),因此可以很方便的替換具體的創(chuàng)建者或新增創(chuàng)建者,用戶可以使用不同的創(chuàng)建者創(chuàng)建不同的對象
抽象工廠模式 VS 創(chuàng)造者模式

1.抽象工廠模式實(shí)現(xiàn)對同一類產(chǎn)品的創(chuàng)建,不用關(guān)心構(gòu)建過程,只關(guān)心什么產(chǎn)品用什么工廠即可
2.建造者模式則是要求按照指定的藍(lán)圖建造產(chǎn)品,它的主要目的是通過組裝配件而產(chǎn)生一個(gè)新產(chǎn)品

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容