前言

写给自己-贵在坚持。建造者模式不复杂,但是想个形象的例子好难。

介绍-建造者模式

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

实现

建造者模式主要是应对复杂对象,在之前讲的滑板鞋的例子看上去不是很适合,因为它并不复杂。但是我们把一双鞋子拆分一下:鞋底、鞋带、鞋面 等等。原来它也并不简单,下面通过建造者模式来实现一下造鞋子的流程:

首先是建造者类:

    /// <summary>
/// 建造者基类
/// </summary>
public abstract class Builder
{
/// <summary>
/// 组装鞋底
/// </summary>
public abstract void BuildTread();
/// <summary>
/// 组装鞋面
/// </summary>
public abstract void BuildVamp();
/// <summary>
/// 穿鞋带
/// </summary>
public abstract void BuildShoeLace();
/// <summary>
/// 鞋子出厂
/// </summary>
/// <returns></returns>
public abstract Shoes OutShoes();
}

工厂里谁是建造者,当然是工人:

  /// <summary>
/// 操作员1
/// </summary>
public class Operator1 : Builder
{
Shoes shoes = new Shoes();
public override void BuildShoeLace()
{
shoes.AddPart("鞋带1");
} public override void BuildTread()
{
shoes.AddPart("鞋底1");
} public override void BuildVamp()
{
shoes.AddPart("鞋面1");
} public override Shoes OutShoes()
{
return shoes;
}
} /// <summary>
/// 操作员2
/// </summary>
public class Operator2 : Builder
{
Shoes shoes = new Shoes();
public override void BuildShoeLace()
{
shoes.AddPart("鞋带2");
} public override void BuildTread()
{
shoes.AddPart("鞋底2");
} public override void BuildVamp()
{
shoes.AddPart("鞋面2");
} public override Shoes OutShoes()
{
return shoes;
}
}

还是产品-鞋子:

  /// <summary>
/// 鞋子
/// </summary>
public class Shoes
{
public Shoes()
{
Parts = new List<string>();
}
List<string> Parts { get; set; } public void AddPart(string part)
{
Parts.Add(part);
}
public void ShowParts()
{
for(int i =,c = Parts.Count;i < c; i++)
{
Console.WriteLine("我的滑板鞋建造的顺序是_{0}:{1}",i,Parts[i]);
}
}
}

假如是你工人的话,你会自觉的干活吗?(我不会,嘿嘿...所以需要老板来指挥):

   public class Boss
{
public Shoes BuidShoes(Builder builder)
{
builder.BuildTread();
builder.BuildVamp();
builder.BuildShoeLace();
return builder.OutShoes();
}
}

下面看调用:

namespace DesignPattern
{
class Program
{
static void Main(string[] args)
{
Boss boss = new Boss();
Builder builder1 = new Operator1();
Shoes shoes1 = boss.BuidShoes(builder1);
shoes1.ShowParts();
Console.WriteLine("-----------------华丽的分割线-----------------");
Builder builder2 = new Operator2();
Shoes shoes2 = boss.BuidShoes(builder2);
shoes2.ShowParts(); Console.Read();
}
}
}

运行结果:

欢迎批评指正,转载请注明出处 http://www.cnblogs.com/xinwang/p/6380564.html

C# 设计模式巩固笔记 - 建造者模式的更多相关文章

  1. 设计模式之笔记--建造者模式(Builder)

    建造者模式(Builder) 定义 建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 类图 描述 Builder:定义一个建造者抽象类,以规范产 ...

  2. Java-马士兵设计模式学习笔记-建造者模式

    一.概述 二.代码 1.Animal.java public interface Animal { public void bark(); } 2.Dog.java public class Dog ...

  3. java23种设计模式——五、建造者模式

    源码在我的github和gitee中获取 目录 java23种设计模式-- 一.设计模式介绍 java23种设计模式-- 二.单例模式 java23种设计模式--三.工厂模式 java23种设计模式- ...

  4. Java学习笔记——设计模式之九.建造者模式

     建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. Product类: package cn.happy.design_pattern._09b ...

  5. 设计模式系列之建造者模式(Builder Pattern)——复杂对象的组装与创建

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  6. 【原】iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数

    本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解释建造者模式的概念,那些东西太虚了.设计模式这种东西是为了解决实际问题的,不能为了设计模式而设计模式, ...

  7. 设计模式学习之建造者模式(Builder,创建型模式)(6)

    假如我们需要建造一个房子,并且我们也不知道如何去建造房子,所以就去找别人帮我们造房子 第一步: 新建一个房子类House,里面有房子该有的属性,我们去找房子建造者接口HouseBuilder,我们要建 ...

  8. PHP设计模式之:建造者模式

    建造者模式: 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示的设计模式; 目的: 消除其他对象复杂的创建过程 结构图: 优点: 建造者模式可以很好的将一个对象的实现与相关的“业 ...

  9. C#学习笔记-建造者模式

    题目:用程序画一个小人. 实现: public partial class Form1 : Form { public Form1() { InitializeComponent(); } priva ...

随机推荐

  1. PHP双向队列,双端队列代码

    <?php /**  * User: jifei  * Date: 2013-07-30  * Time: 23:12 */ /**  * PHP实现双向队列,双端队列  * 双端队列(dequ ...

  2. Java 为什么要使用反射(通俗易懂的举例)

    Java反射最大的好处就是能在运行期间,获得某个类的结构.成员变量,用来实例化. 下列是具体使用场景:假如我们有两个程序员,一个程序员在写程序的时候,需要使用第二个程序员所写的类,但第二个程序员并没完 ...

  3. C++通过HTTP请求Get或Post方式请求Json数据(转)

    原文网址:https://www.cnblogs.com/shike8080/articles/6549339.html #pragma once#include <iostream>#i ...

  4. 在python3下对数据分块(8x8大小)使用OpenCV的离散余弦变换DCT

    在MATLAB中有blkproc (blockproc)对数据处理, 在python下没找到对应的Function, 这里利用numpy 的split(hsplit和vsplit) 对数据分块处理成8 ...

  5. 在使用Kafka过程中遇到的错误

    问题一:用kafka命令发送消息时候,一直报WARN Error while fetching metadata with correlation id 0 : {test=UNKNOWN_TOPIC ...

  6. Kafka学习之(四)PHP操作Kafka

    简单测试 环境:Centos6.4,PHP7,kafka服务器IP:192.168.9.154,PHP服务器:192.168.9.157 在192.168.9.157创建目录和文件. //生产者 &l ...

  7. Python3.x:pytesseract识别率提高(样本训练)

    Python3.x:pytesseract识别率提高(样本训练) 1,下载并安装3.05版本的tesseract 地址:https://sourceforge.net/projects/tessera ...

  8. mysql搜索不区分大小写

    mysql搜索是不区分大小写的,这种情况下我们有两种方法解决 知识前提: BINARY binary不是函数,而是一个类型转换运算符,它用来强制字符串为一个二进制字符串,可以理解为在字符串比较的时候区 ...

  9. 20145312 《Java程序设计》第八周学习总结

    20145312 <Java程序设计>第八周学习总结 学习笔记 Chapter 15时间与日期 15.1 日志 15.1.1 日志API简介 java.util.logging包提供了日志 ...

  10. linux 下各个头文件的作用[典]

    linux 下各个头文件的作用   2.6.30.4的头文件的位置和2.6.25.8的不一样,除去内核源码下的include目录外, 在arch/arm/mach-s3c2410/和arch/arm/ ...