系列文章

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

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

引言

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

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

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

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

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

怎么应对这种变化?

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

使用建造者模式的目的?

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

建造者模式定义

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

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

建造者模式类图

建造者模式参与者

抽象建造者(Builder)

为创建一个产品角色对象的各个部件指定抽象接口。

具体建造者(Conctrete Builder)

实现抽象建造者接口,构造和装配产品的各个部件。

定义并明确它所创建的表示。

提供一个返回这个产品的接口。

指挥者(Director)

构建一个使用抽象建造者接口的对象。

产品角色(Product)

被构建的复杂对象,具体建造者创建该产品的内部表示并定义它的装配过程。

包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

实例分析

场景:lz现在在前台点一份大份量的鸡蛋面,据吃货所知,山西面馆中,对鸡蛋面提供三种的做法,1.普通分量的 2.加2元面的大份量的 3.加一个鸡蛋的营养餐。

分析:

抽象建造者:家传制面秘方(算法),所有鸡蛋面的制作过程均要遵循本秘方,否则是砸自己的招牌啊。

具体的建造者:小康师傅(水平有限,面的多少把握不够,徒弟级别),康师傅(多年砍面技术溶于一身,造就了神般的人物,要砍多少面就多少,不多不少正好),康氏(女人,总比男人更懂得营养,营养师级别人物)

指挥者:收银员,根据order指挥这份面如何来做(是否加量,是否加鸡蛋)。

产品角色:鸡蛋面。

代码实现:

建造者 指定不变的创建过程(算法)

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Wolfy.建造者模式
{
/// <summary>
/// 为创建产品指定相对稳定的算法(步骤)
/// </summary>
public abstract class Builder
{
/// <summary>
/// 水温
/// </summary>
public abstract void WaterTemperature();
/// <summary>
/// 削多少下面
/// </summary>
public abstract void CutTimesWheatflour();
/// <summary>
/// 添加西红柿
/// </summary>
public abstract void AddTomattos();
/// <summary>
/// 添加鸡蛋
/// </summary>
public abstract void AddEggs();
/// <summary>
/// 搅拌
/// </summary>
public abstract void Stir();
/// <summary>
/// 返回
/// </summary>
public abstract Food BuildFood();
}
}

具体建造者

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Wolfy.建造者模式
{
/// <summary>
/// 建造者模式中的具体建造者 小康师傅类 负责普通鸡蛋面的生产
/// </summary>
public class LittleMasterKang : Builder
{
Food normalFood = new Food();
public override void WaterTemperature()
{
Console.WriteLine("小康师傅:嗯,水温有100℃了,可以下面了");
normalFood.DicFood.Add("汤",);
} public override void CutTimesWheatflour()
{
Console.WriteLine("小康师傅:咔咔.....嗯,够了");
normalFood.DicFood.Add("面",5f);
} public override void AddTomattos()
{
Console.WriteLine("小康师傅:切两个西红柿,咔咔.....放入锅中");
normalFood.DicFood.Add("西红柿",2f);
} public override void AddEggs()
{
Console.WriteLine("小康师傅:鸡蛋");
normalFood.DicFood.Add("鸡蛋",3f);
} public override void Stir()
{
Console.WriteLine("小康师傅:一圈,二圈,三圈....{0}圈,嗯,够了", );
}
/// <summary>
/// 返回食物
/// </summary>
public override Food BuildFood()
{
return normalFood;
}
}
}

LittleMasterKang

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Wolfy.建造者模式
{
/// <summary>
/// 具体建造者 大师级的康师傅类 用来生产大份量的套餐
/// </summary>
public class MasterKang : Builder
{
Food normalFood = new Food();
public override void WaterTemperature()
{
Console.WriteLine("小康师傅:嗯,水温有100℃了,可以下面了");
normalFood.DicFood.Add("汤", );
} public override void CutTimesWheatflour()
{
Console.WriteLine("康师傅:咔咔.....嗯,够了");
normalFood.DicFood.Add("面(2¥)", 7f);
} public override void AddTomattos()
{
Console.WriteLine("康师傅:切两个西红柿,咔咔.....放入锅中");
normalFood.DicFood.Add("西红柿", 2f);
} public override void AddEggs()
{
Console.WriteLine("康师傅:鸡蛋");
normalFood.DicFood.Add("鸡蛋", 3f);
} public override void Stir()
{
Console.WriteLine("康师傅:一圈,二圈,三圈....{0}圈,嗯,够了", );
}
/// <summary>
/// 返回食物
/// </summary>
public override Food BuildFood()
{
return normalFood;
}
}
}

MasterKang

指挥者

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Wolfy.建造者模式
{
/// <summary>
/// 收银员类 即建造者模式中的指挥者 根据订单指挥 到底做什么样的面
/// </summary>
public class Cashier
{
public void BuidFood(Builder builder)
{
builder.WaterTemperature();
builder.CutTimesWheatflour();
builder.AddTomattos();
builder.AddEggs();
builder.Stir();
}
}
}

Cashier

产品Food

 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[] + food[] + food[] + food[];
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();
}
}
}

结果

总结

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

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

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

参考

http://www.cnblogs.com/ywqu/archive/2010/01/11/1643753.html

[Head First设计模式]山西面馆中的设计模式——建造者模式的更多相关文章

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

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 引言 不知不自觉又将设计模式融入生活了,吃个饭也不得安生,也发现生活中的很多场景,都可以用设计模式来模拟.原来设计模式就在 ...

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

    引言 在山西面馆吃鸡蛋面的时候突然想起装饰者这个模式,觉得面馆这个场景跟书中的星巴兹咖啡的场景很像,边吃边思考装饰者模式.这里也就依葫芦画瓢,换汤不换药的用装饰者模式来模拟一碗鸡蛋面是怎么出来的吧.吃 ...

  3. [Head First设计模式]抢票中的设计模式——代理模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  4. js架构设计模式——理解javascript中的MVVM开发模式

    理解javascript中的MVVM开发模式 http://blog.csdn.net/slalx/article/details/7856769 MVVM的全称是Model View ViewMod ...

  5. PHP 实战之设计模式:PHP 中的设计模式

    本文主要讨论下Web开发中,准确而言,是PHP开发中的相关的设计模式及其应用.有经验的开发者肯定对于设计模式非常熟悉,但是本文主要是针对那 些初级的开发者.首先我们要搞清楚到底什么是设计模式,设计模式 ...

  6. 设计模式实战系列之@Builder和建造者模式

    前言 备受争议的Lombok,有的人喜欢它让代码更整洁,有的人不喜欢它,巴拉巴拉一堆原因.在我看来Lombok唯一的缺点可能就是需要安装插件了,但是对于业务开发的项目来说,它的优点远远超过缺点. 我们 ...

  7. 设计模式(五)Builder Pattern建造者模式

    在我们日常生活中,如构建一个飞船,一个手机,一栋建筑,都会有非常复杂的组装,这时候应该用到建造者模式 以建造一个飞船为例 案例:造小页飞船 1.飞船各部分元件 package com.littlepa ...

  8. [Python设计模式] 第13章 造小人——建造者模式

    github地址:https://github.com/cheesezh/python_design_patterns 题目1 用程序模拟一个画小人的过程,要求小人要有头,身子,左手,右手,左脚,右脚 ...

  9. 《大话设计模式》ruby版代码:建造者模式

    需求: 画一个小人,有头,有身体,两手两脚即可. 初始代码: # -*- encoding: utf-8 -*- #小人一 puts '这是第一个小人' puts '小人一:头' puts '小人一: ...

随机推荐

  1. UEFI+GPT模式下的Windows系统中分区结构和默认分区大小及硬盘整数分区研究

    内容摘要:本文主要讨论和分析在UEFI+GPT模式下的Windows系统(主要是最新的Win10X64)中默认的分区结构和默认的分区大小,硬盘整数分区.4K对齐.起始扇区.恢复分区.ESP分区.MSR ...

  2. C库函数使用与总结之字符串处理函数

    1. memcpy(拷贝内存内容) [头文件]#include <string.h> [函数原型]void *memcpy(void *dest, const void *src, siz ...

  3. WSTMall网站系统最新官方版

    WSTMall V1.0是在thinkphp 的经典版本3.2.2基础上进行优化开发的, TP 3.2.2不是thinkphp的一个最新的版本,却是thinkphp最金典的一个版本,正所谓站在巨人的肩 ...

  4. 使用IntelliJ IDEA搭建多maven模块JAVA项目

    一.新建项目和模块 步骤: 1. 新建一个项目,因为maven管理jar包非常方便,故此处建立一个maven项目:New Project->Maven->(Create from arch ...

  5. UVA计数方法练习[3]

    UVA - 11538 Chess Queen 题意:n*m放置两个互相攻击的后的方案数 分开讨论行 列 两条对角线 一个求和式 可以化简后计算 // // main.cpp // uva11538 ...

  6. COGS130. [USACO Mar08] 游荡的奶牛[DP]

    130. [USACO Mar08] 游荡的奶牛 ★☆   输入文件:ctravel.in   输出文件:ctravel.out   简单对比时间限制:1 s   内存限制:128 MB 奶牛们在被划 ...

  7. 第26章 java进制操作

    java进制操作 1.二进制 二进制只有0和1,逢二进一 二进制多用在计算机中,来自计算机硬件的开关闭合 2.位运算 分别讲解: 2.1.按位与 & 两位全为1,结果才为1 0&0=0 ...

  8. Java正则抓取email

    实现思路 1.使用Java.net.URL对象,绑定网络上某一个网页的地址 2.通过java.net.URL对象的openConnection()方法获得一个HttpConnection对象 3.通过 ...

  9. winform窗体控件(全)

    回顾跟补充下除了昨天那常用6个其他的winform窗体控件作用 1:Button:按钮 (1)AutoSize:如果是True的情况下,内容将会撑开:False的话会另起一行 (2)Enabled: ...

  10. Tomcat 7.0的配置

     一.安装JDK 1.7     1.添加环境变量:在我的电脑->属性->高级->环境变量     2.新建系统变量,变量名:JAVA_HOME  变量值:C:\Program Fi ...