建造者模式
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
介绍
应用实例: 1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。
实现
我们假设一个快餐店的商业案例,其中,一个典型的套餐可以是一个汉堡(Burger)和一杯冷饮(Cold drink)。汉堡(Burger)可以是素食汉堡(Veg Burger)或鸡肉汉堡(Chicken Burger),它们是包在纸盒中。冷饮(Cold drink)可以是可口可乐(coke)或百事可乐(pepsi),它们是装在瓶子中。
//创建一个表示食物条目和食物包装的接口。
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());