一天一個設計模式之JS實現——建造者模式

參考文章:
java設計模式之建造者模式javascript

1、什麼是建造者模式
建造者模式:是將一個複雜的對象的構建與它的表示分離,使得一樣的構建過程能夠建立不一樣的表示。
工廠類模式提供的是建立單個類的模式,而建造者模式則是將各類產品集中起來進行管理,用來建立複合對象,所謂複合對象就是指某個類具備不一樣的屬性。html

具體表現爲4個角色
產品(Product):建造的產物
導演(Director):指揮建造的過程,不涉及建造的細節
建造者(Builder):抽象建造過程,規定產品哪些部分須要建立
具體建造者(ConceteBuilder):實現Builder,實現產品各個部分的建造,並提供產品java

使用場景:
須要生成的對象有複雜的內部結構,且各部分都會根據需求發生組裝變化
缺點:
一、當產品內部很是複雜,須要用大量的具體建造者,致使系統龐大
二、產品要有共同點,範圍受限制設計模式

下面舉個例子:肯德基點餐環節,角色對應分別以下
Product:一餐食物(Meal)
Director:前臺銷售員(Seller)
Builder:抽象建造者(Builder)
ConceteBuilder:廚師(Cook)ui

首先實現一些食物this

// Food 食物抽象類
class Food {
    constructor() {
        this.name = null;
        this.price = null;
    }
}
// 漢堡
class Burger extends Food {
    constructor() {
        super();
        this.name = '漢堡';
        this.price = 16;
    }
}
// 雞翅
class ChickenWing extends Food {
    constructor() {
        super();
        this.name = '雞翅';
        this.price = 12;
    }
}
// 可樂
class Coke extends Food {
    constructor() {
        super();
        this.name = '可樂';
        this.price = 6;
    }
}

產品Product
一桌餐飯能夠有任意數量的任意組合設計

// Product
class Meal {
    constructor() {
        this.foods = [];
    }
    
    addFood(item) {
        this.foods.push(item);
    }
    showPrice() {
        var i = this.foods.length,
            price = 0;
        while(i--) {
            price += this.foods[i].price;
        }

        return price;
    }
}

抽象建造類Builder
規範各部分的建造code

// Builder
class Builder {
    cookBurger() {}
    cookWing() {}
    cookCoke() {}
    finishCook() {}
}

具體建造類
廚師負責各個食物的烹飪,並添加到meal裏htm

// ConceteBuilder
class Cook extends Builder {
    constructor() {
        super();
        this.meal = new Meal();
    }

    cookBurger(number) {
        for (var i = 0; i < number; i++) {
            this.meal.addFood(new Burger());
        }
    }
    cookWing(number) {
        for (var i = 0; i < number; i++) {
            this.meal.addFood(new ChickenWing());
        }
    }
    cookCoke(number) {
        for (var i = 0; i < number; i++) {
            this.meal.addFood(new Coke());
        }
    }
    finishCook() {
        return this.meal;
    }
}

導演Director
負責通知廚房須要烹飪啥啥啥。對象

// Director
class Seller {
    constructor() {
        this.builder = null;
    }

    bindCook(builder) {
        this.builder = builder;
    }
    placeOrder(burgerAmount, wingAmount, cokeAmount) {
        this.builder.cookBurger(burgerAmount);
        this.builder.cookWing(wingAmount);
        this.builder.cookCoke(cokeAmount);

        var meal = this.builder.finishCook();
        console.log('總價:' + meal.showPrice());
        return meal;
    }
}

最後模擬一次下單場景

var seller = new Seller();
var cook = new Cook();
seller.bindCook(cook);
seller.placeOrder(1, 2, 3); // 58

總結:
易於解耦
將產品自己與產品建立過程進行解耦,能夠使用相同的建立過程來獲得不一樣的產品。也就說細節依賴抽象。
易於精確控制對象的建立
將複雜產品的建立步驟分解在不一樣的方法中,使得建立過程更加清晰
易於拓展 增長新的具體建造者無需修改原有類庫的代碼,易於拓展,符合「開閉原則「。

相關文章
相關標籤/搜索