1. 程式人生 > >設計模式系列 - 建造者模式

設計模式系列 - 建造者模式

pack ddr 實現 new 創建 key strong str 分享

建造者模式通過將復雜對象逐一拆解成單一的簡單對象,然後通過對簡單對象的創建,最終構建出一個復雜對象。

介紹

在現實世界中,和建造者模式最為相似的是我們到餐廳點餐的流程。在點餐的過程中,我們是不用關系點餐的先後順序,等我們點完後,點餐系統會自動將我們的所有餐品列表和消費情況全部一次性羅列出來,並且最後都會統一結算。這個過程其實就是建造者模式的應用。

類圖描述

技術分享圖片

通過上述類圖,我們可以發現一個復雜對象通過 MealBuilder 來進行創建,然後 MealBuilder 在進行細化,通過實例化不同的 IItem 類型,來達到創建不同的實例對象並對其進行最終的拼裝組合。

代碼實現

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、定義模擬用戶點餐類

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、上層調用

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();
    }
}

總結

建造者模式使用多個簡單的對象進行拼裝組合,並最終構建出一個復雜對象,它提供了一種創建對象的最佳方式。

設計模式系列 - 建造者模式