建造者模式通過將復(fù)雜對(duì)象逐一拆解成單一的簡(jiǎn)單對(duì)象,然后通過對(duì)簡(jiǎn)單對(duì)象的創(chuàng)建,最終構(gòu)建出一個(gè)復(fù)雜對(duì)象。
介紹
在現(xiàn)實(shí)世界中,和建造者模式最為相似的是我們到餐廳點(diǎn)餐的流程。在點(diǎn)餐的過程中,我們是不用關(guān)系點(diǎn)餐的先后順序,等我們點(diǎn)完后,點(diǎn)餐系統(tǒng)會(huì)自動(dòng)將我們的所有餐品列表和消費(fèi)情況全部一次性羅列出來,并且最后都會(huì)統(tǒng)一結(jié)算。這個(gè)過程其實(shí)就是建造者模式的應(yīng)用。
類圖描述

通過上述類圖,我們可以發(fā)現(xiàn)一個(gè)復(fù)雜對(duì)象通過 MealBuilder 來進(jìn)行創(chuàng)建,然后 MealBuilder 在進(jìn)行細(xì)化,通過實(shí)例化不同的 IItem 類型,來達(dá)到創(chuàng)建不同的實(shí)例對(duì)象并對(duì)其進(jìn)行最終的拼裝組合。
代碼實(shí)現(xiàn)
1、定義食物制作和信息接口
public interface IPacking
{
string Pack();
}
public interface IItem
{
string Name();
IPacking Packing();
float Price();
}
2、定義抽象食物
public abstract class ColdDrink:IItem
{
public abstract string Name();
public IPacking Packing()
{
return new Bottle();
}
public abstract float Price();
}
public abstract class Burger:IItem
{
public abstract string Name();
public IPacking Packing()
{
return new Wrapper();
}
public abstract float Price();
}
3、定義具體制作類
class Bottle:IPacking
{
public string Pack() => "Bottle";
}
public class Wrapper : IPacking
{
public string Pack() => "Wrapper";
}
4、定義具體食物類
public class Pepsi : ColdDrink
{
public override string Name() => "Pepsi";
public override float Price() => 35.0f;
}
public class Coke : ColdDrink
{
public override string Name() => "Coke";
public override float Price() => 30.0f;
}
public class VegBurger:Burger
{
public override string Name() => "Veg Burger";
public override float Price() => 25.0f;
}
5、定義模擬用戶點(diǎn)餐類
public class MealBuilder
{
public Meal PrepareVegMeal()
{
Meal meal = new Meal();
meal.AddItem(new VegBurger());
meal.AddItem(new Coke());
return meal;
}
public Meal PrepareNonMeal()
{
Meal meal = new Meal();
meal.AddItem(new ChickenBurger());
meal.AddItem(new Pepsi());
return meal;
}
}
6、上層調(diào)用
class Program
{
static void Main(string[] args)
{
MealBuilder builder = new MealBuilder();
Meal vegMeal = builder.PrepareVegMeal();
Console.WriteLine("Veg Meal");
vegMeal.ShowItems();
Console.WriteLine($"Total Cost:{vegMeal.GetCost()}");
Console.WriteLine("-----------------");
Meal nonVegMeal = builder.PrepareNonMeal();
Console.WriteLine("Non-Veg Meal");
nonVegMeal.ShowItems();
Console.WriteLine($"Total Cost:{nonVegMeal.GetCost()}");
Console.ReadKey();
}
}
總結(jié)
建造者模式使用多個(gè)簡(jiǎn)單的對(duì)象進(jìn)行拼裝組合,并最終構(gòu)建出一個(gè)復(fù)雜對(duì)象,它提供了一種創(chuàng)建對(duì)象的最佳方式。
|