您的位置:首页 > 其它

[Head First设计模式]山西面馆中的设计模式——建造者模式

2014-03-14 21:46 211 查看
原文:[Head First设计模式]山西面馆中的设计模式——建造者模式

系列文章

[Head First设计模式]山西面馆中的设计模式——装饰者模式

[Head First设计模式]山西面馆中的设计模式——观察者模式

引言

将学习融入生活中,是件很happy的事情,不会感觉到累。一个感觉:很好玩!挺开心的......


为什么会出现建造者模式?

在软件系统中,有时面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成。

这个复杂的对象的各个部分经常面临剧烈变化,但是将它们组合在一起的算法却相对稳定。

比如:建一所房子,建房子的过程基本不变(算法:画图-地基-建造),但是门窗之类的组建确是易变的。

怎么应对这种变化?

如何提供一种“封装机制“来隔离出”复杂对象的各个部分“的变化,从而保持系统中的”稳定构建算法“不随需求改变而改变,这就是建造者模式。

使用建造者模式的目的?

将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。


建造者模式定义

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

一步步创建复杂的对象,它允许用户只通过制定复杂对象的类型和内容就可以创建它们,用户不知道内部的具体构建细节。

建造者模式类图

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Wolfy.建造者模式
{
/// <summary>
/// 产品类
/// </summary>
public class Food
{
Dictionary<string, double> dicFood;

public Dictionary<string, double> DicFood
{
get { return dicFood; }
set { dicFood = value; }
}
public Food()
{
dicFood = new Dictionary<string, double>();
}
private double price;
private string foodName;
public void ShowFood()
{
foreach (KeyValuePair<string, double> item in dicFood)
{
foodName += item.Key + ",";
price += item.Value;
}
string[] food = foodName.TrimEnd(',').Split(',');
//为了显示 按正常的顺序显示
foodName = food[2] + food[3] + food[0] + food[1];
Console.WriteLine(foodName + "\t" + price + "¥");
}
}
}


Food
控制台代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Wolfy.建造者模式
{
class Program
{
static void Main(string[] args)
{
//创建指挥者
Cashier director = new Cashier();
//创建普通鸡蛋面的制造者 小康师傅
LittleMasterKang kang = new LittleMasterKang();
director.BuidFood(kang);
Food food = kang.BuildFood();
food.ShowFood();
Console.WriteLine();
//创建大份量鸡蛋面建造者 康师傅
MasterKang k = new MasterKang();
director.BuidFood(k);
Food f = k.BuildFood();
f.ShowFood();
Console.Read();
}
}
}


结果



总结

建造者模式类似于工厂模式,但又有所不同,建造者模式最主要的功能是基本方法的调用顺序的安排,这些基本方法已经实现,而工厂方法则重点是创建,组装顺序则不关心。
使用场景

一是产品类非常复杂,或者产品类中调用顺序不同会产生不同的效果。

二是在对象创建过程中会使用到系统中的一些其他对象这些对象在产品对象的创建过程中不容易得到

参考

/article/4754236.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: