建造者模式

72 阅读2分钟

建造者模式

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。

介绍

应用实例:  1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。

实现

我们假设一个快餐店的商业案例,其中,一个典型的套餐可以是一个汉堡(Burger)和一杯冷饮(Cold drink)。汉堡(Burger)可以是素食汉堡(Veg Burger)或鸡肉汉堡(Chicken Burger),它们是包在纸盒中。冷饮(Cold drink)可以是可口可乐(coke)或百事可乐(pepsi),它们是装在瓶子中。

image.png

//创建一个表示食物条目和食物包装的接口。
interface Item {
    name(): string;
    packing(): Packing;
    price(): number;
}
interface Packing {
    pack(): string;
}
//创建实现 Packing 接口的实体类。
class Wrapper implements Packing {
    pack(): string {
        return "Wrapper";
    }
}

class Bottle implements Packing {
    public pack(): string {
        return "Bottle";
    }
}
//创建实现 Item 接口的抽象类,该类提供了默认的功能。
abstract class Burger implements Item {
    packing(): Packing {
        return new Wrapper();
    }
    abstract name(): string;
    abstract price(): number;
}

abstract class ColdDrink implements Item {
    packing(): Packing {
        return new Bottle();
    }
    abstract name(): string;
    abstract price(): number;
}
//创建扩展了 Burger 和 ColdDrink 的实体类。
// Wrapper类型包装
class VegBurger extends Burger {
    public price(): number {
        return 25.0;
    }
    public name(): string {
        return "Veg Burger";
    }
}

class ChickenBurger extends Burger {
    public price(): number {
        return 50.5;
    }
    public name(): string {
        return "Chicken Burger";
    }
}
// Bottle类型包装
class Coke extends ColdDrink {
    public price(): number {
        return 30.0;
    }
    public name(): string {
        return "Coke";
    }
}

class Pepsi extends ColdDrink {
    public price(): number {
        return 35.0;
    }
    public name(): string {
        return "Pepsi";
    }
}
class Meal {
    private items: Array<Item> = new Array<Item>();

    public addItem(item: Item): void {
        this.items.push(item);
    }

    public getCost(): number {
        let cost: number = 0.0;
        for (let item in this.items) {
            cost += this.items[item].price();
        }
        return cost;
    }

    showItems(): void {
        for (let item in this.items) {
            console.log("Item : " + this.items[item].name());
            console.log(", Packing : " + this.items[item].packing().pack());
            console.log(", Price : " + this.items[item].price());
        }
    }
}

class MealBuilder {
    // 套餐一
    public prepareVegMeal(): Meal {
        const meal: Meal = new Meal();
        meal.addItem(new VegBurger());
        meal.addItem(new Coke());
        return meal;
    }
    // 套餐二
    public prepareNonVegMeal(): Meal {
        const meal: Meal = new Meal();
        meal.addItem(new ChickenBurger());
        meal.addItem(new Pepsi());
        return meal;
    }
}


const mealBuilder: MealBuilder = new MealBuilder();

const vegMeal: Meal = mealBuilder.prepareVegMeal();
console.log("套餐一");
vegMeal.showItems();// 展示套餐
console.log("Total Cost: " + vegMeal.getCost());

const nonVegMeal: Meal = mealBuilder.prepareNonVegMeal();
console.log("\n\n套餐二");
nonVegMeal.showItems();
console.log("Total Cost: " + nonVegMeal.getCost());