码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式系列 - 建造者模式

时间:2018-12-08 14:44:32      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:str   name   img   设计   实现   rri   组合   关系   创建   

建造者模式通过将复杂对象逐一拆解成单一的简单对象,然后通过对简单对象的创建,最终构建出一个复杂对象。

介绍

在现实世界中,和建造者模式最为相似的是我们到餐厅点餐的流程。在点餐的过程中,我们是不用关系点餐的先后顺序,等我们点完后,点餐系统会自动将我们的所有餐品列表和消费情况全部一次性罗列出来,并且最后都会统一结算。这个过程其实就是建造者模式的应用。

类图描述

技术分享图片

通过上述类图,我们可以发现一个复杂对象通过 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();
    }
}

总结

建造者模式使用多个简单的对象进行拼装组合,并最终构建出一个复杂对象,它提供了一种创建对象的最佳方式。

设计模式系列 - 建造者模式

标签:str   name   img   设计   实现   rri   组合   关系   创建   

原文地址:https://www.cnblogs.com/hippieZhou/p/9940354.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!