C# 设计模式巩固笔记 - 建造者模式
前言
写给自己-贵在坚持。建造者模式不复杂,但是想个形象的例子好难。
介绍-建造者模式
定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
实现
建造者模式主要是应对复杂对象,在之前讲的滑板鞋的例子看上去不是很适合,因为它并不复杂。但是我们把一双鞋子拆分一下:鞋底、鞋带、鞋面 等等。原来它也并不简单,下面通过建造者模式来实现一下造鞋子的流程:
首先是建造者类:
/// <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# 设计模式巩固笔记 - 建造者模式的更多相关文章
- 设计模式之笔记--建造者模式(Builder)
建造者模式(Builder) 定义 建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 类图 描述 Builder:定义一个建造者抽象类,以规范产 ...
- Java-马士兵设计模式学习笔记-建造者模式
一.概述 二.代码 1.Animal.java public interface Animal { public void bark(); } 2.Dog.java public class Dog ...
- java23种设计模式——五、建造者模式
源码在我的github和gitee中获取 目录 java23种设计模式-- 一.设计模式介绍 java23种设计模式-- 二.单例模式 java23种设计模式--三.工厂模式 java23种设计模式- ...
- Java学习笔记——设计模式之九.建造者模式
建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. Product类: package cn.happy.design_pattern._09b ...
- 设计模式系列之建造者模式(Builder Pattern)——复杂对象的组装与创建
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 【原】iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数
本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解释建造者模式的概念,那些东西太虚了.设计模式这种东西是为了解决实际问题的,不能为了设计模式而设计模式, ...
- 设计模式学习之建造者模式(Builder,创建型模式)(6)
假如我们需要建造一个房子,并且我们也不知道如何去建造房子,所以就去找别人帮我们造房子 第一步: 新建一个房子类House,里面有房子该有的属性,我们去找房子建造者接口HouseBuilder,我们要建 ...
- PHP设计模式之:建造者模式
建造者模式: 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示的设计模式; 目的: 消除其他对象复杂的创建过程 结构图: 优点: 建造者模式可以很好的将一个对象的实现与相关的“业 ...
- C#学习笔记-建造者模式
题目:用程序画一个小人. 实现: public partial class Form1 : Form { public Form1() { InitializeComponent(); } priva ...
随机推荐
- hdu6208 The Dominator of Strings
地址: 题目: The Dominator of Strings Time Limit: 3000/3000 MS (Java/Others) Memory Limit: 65535/32768 ...
- java虚拟机-垃圾回收算法
在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给了JVM来处理.但是首先需要明确,什么样的对象才能当为垃圾: 1.引用计数法:如果某个引用(即指针)指向对象,那么说明该对象还 ...
- MVP架构学习
MVP架构学习 M:数据层(数据库,文件,网络等...) V:UI层(Activity,Fragment,View以及子类,Adapter以及子类) P:中介,关联UI层和数据层,因为V和M是相互看不 ...
- Linux 日志分析工具(logwatch)安装及使用
Linux 日志分析工具(logwatch)安装及使用 日志是非常重要的系统文件,管理员每天的重要工作就是分析和查看服务器的日志,判断服务器的健康状态.但是日志管理又是一项非常枯燥的工作,如果需要管理 ...
- 浅谈Vue中的Prop
Prop 基本用法 Prop的基本用法很简单,只需要在子组件的Vue实例中定义该属性并把值设为目标属性的数组即可 Vue.component('child', { ... // 接收message p ...
- Python3.x:获取代理ip以及使用
Python3.x:获取代理ip以及使用 python爬虫浏览器伪装 #导入urllib.request模块 import urllib.request #设置请求头 headers=("U ...
- 从toString()方法到Object.prototype.toString.call()方法
一.toString方法和Object.prototype.toSting.call()的区别 var arr=[1,2]; 直接对一个数组调用toString()方法, console.log(ar ...
- sqlx基础语法与应用
基础: ``` 引用:_ "github.com/go-sql-driver/mysql" "github.com/jmoiron/sqlx" ``` 初始化 ...
- 20145313Java第五次实验
实验内容 网络编程TCP代码的结对完成,一人服务器,一人客户端,进行数据传输. 结伴对象:20145313卢鑫 实验步骤 本次实验中,需要两台电脑互联.一台电脑开启无线网,充当客户端,另一台连入局域网 ...
- sqoop将mysql的tinyint类型转化为boolean类型
当mysql中的字段为tinyint类型时,通过sqoop导入数据到hdfs上,在hdfs上显示的是true,false值.为了显示0,1. 解决方法: jdbc:mysql://<hostna ...