设计模式之C#实现---Builder
我们将要介绍一个和它比较像的创建型模式 Builder (至于关于 Builder 的详细内容您可以参考 GOF 的书,在这里不重复了。)。在 GOF 的书里 Builder 的目的是这样的: Separate the construction of a complex object from its representation so that the same construction process can create different representations. 在我的程序设计中很难免会使用复杂的对象比如:车的组成、电脑的组成以及人在内。那么我们在创建电脑这个对象的时候我想我们需要一步一步的创建组成电脑的每一部分,先创建 CPU 对象、 Memory 对象、 HardDisk 对象等等。 Builder 就是这样一种模式用来一步一步的创建对象的每一部分。回忆一下 AbstractFactory 也是创建一族相关的对象, Builder 也是创建一些相关的对象,两者之间的区别很微妙需要在以后的实践中细细体会。
既然文章叫设计模式之C#实现那么肯定少不了代码了,这次我想说的更清楚一些,我打算从如下两个方面来实现,首先我想要直接实现他的结构,也就是我们在下面的图中看到的那些类。接着我将用以个具体的例子或者书上的例子描述一下用来加深理解,希望我的描述可以帮助你更好的学习。
从图上我们可以看出我们的Builder接口中有两个BuilderPart方法A、B,以及一个GetResult方法用来返回创建的对象。将我们用ConcreteBuilder1和ConcreteBuilder1实现接口的时候我们分别在其中加入了一个Private的对象,用来返回建立好的对象,在该实例的内部则是经过了两步才完成了Product对象的初始化。我们建立的Product是由一个Hashtable组成,可以添加和显示自己的每一个部分(就是Hashtable里面的每一个键/值)。好了不废话了看看下面的实现代码,在WinForm中调试通过,你可以参看本系列的AbstractFactory文章找到里面的相关表现对象(RichTextBox)。
代码中有少量的注释是为了更好的理解。
using System;
namespace Builder_Me{
using System.Collections;
// specifies an abstract interface for creating parts of a Product object.
//为创建对象的一个部分指定一个接口
public interface Builder{
void BuildPartA();
void BuildPartB();
Product GetResult();
}
// constructs and assembles parts of the product by impementing the Builder interface.
// defines and keeps track of the representation it creates.
// provides an interface for retrieving the product.
public class ConcreteBuilder1 : Builder{
private Product m_Product;
public void BuildPartA(){
this.m_Product = new Product();
this.m_Product.AddParts("1","PartA");
}
public void BuildPartB(){
this.m_Product.AddParts("2","PartB");
}
public Product GetResult(){
return this.m_Product;
}
}
public class ConcreteBuilder2 : Builder{
private Product m_Product;
public void BuildPartA(){
//必须先调用该方法否则不能实例化对象
this.m_Product = new Product();
this.m_Product.AddParts("3","Part1");
}
public void BuildPartB(){
this.m_Product.AddParts("4","Part2");
}
public Product GetResult(){
return this.m_Product;
}
}
// construct an object using the Builder interface.
public class Director{
public void Construct(Builder builder){
//顺序不能变
builder.BuildPartA();
builder.BuildPartB();
}
}
// represents the complex object under construction.ConcreteBuilder builds
// the product's internal representation and defines the process by which it's
// assembled.
// includes classes that define the constituent parts,including interfaces for
// assembling the parts into the final result.
//要创建复杂的对象该对象我们用Hashtable组合表示。
public class Product{
Hashtable m_Parts = new Hashtable();
public void AddParts(string partKey,string partValue){
this.m_Parts.Add(partKey,partValue);
}
public string ShowSelfParts(){
string strResult = string.Empty;
int i = 1;
foreach(string strTmp in this.m_Parts.Values){
strResult +="Part"+i.ToString()+":/t"+strTmp+"/n";
i++;
}
return strResult;
}
}
}
客户端的代码片断如下:
Director director = new Director();
Builder builder1 = new ConcreteBuilder1();
Builder builder2 = new ConcreteBuilder2();
director.Construct( builder1 );
Product p1 = builder1.GetResult();
this.richTextBox1.AppendText(p1.ShowSelfParts());
director.Construct( builder2 );
Product p2 = builder2.GetResult();
this.richTextBox1.AppendText(p2.ShowSelfParts());
由于GOF的例子是C++实现所以转换成C#也非常容易,我在这里就不转换了,有兴趣的人可以转换跟帖。
本人能力有限,如果在上面有什么说错的或者不准确地方请网友指正,我将虚心学习,我的email:wu_jian830@hotmail.com。
相关文章:

微信小程序开发之不能使用eval函数的问题
2019独角兽企业重金招聘Python工程师标准>>> 一 eval函数问题 JavaScript中的eval函数是颇受开发者争议的问题之一,问题主要在于其可能导致的不安全性。有关此方面问题,在此不再赘述,读者可能很容易地浏览到许多介绍性文章。 但是…

设计模式之C#实现--FactoryMethod
作者:cuike519的专栏 http://blog.csdn.net/cuike519/工厂方法的目的很明确就是定义一个用来创建对象的接口,但是他不直接创建对象,而由他的子类来创建,这样一来就将创建对象的责任推迟到了该接口的子类中,创建什么类…
美国AI博士指出,自学Python到底能做什么
我见过市面上很多的 Python 讲解教程和书籍,他们大都这样讲 Python 的:先从 Python 的发展历史开始,介绍 Python 的基本语法规则,Python 的 list, dict, tuple 等数据结构,然后再介绍字符串处理和正则表达式࿰…

关于微博溯源的后续问题
1、在进行关键词搜索的时候,如何分词,我们不可能用语料库进行匹配,已没有语料可以学习。 2、关于转折点的寻找。目前我们使用高级搜索,从当前时间往前推,根据搜索到微博的条数变化,确定时间发生具体时间&am…

python3的数据类型以及模块的含义
python3的数据类型以及模块的含义购物车转载于:https://blog.51cto.com/11834445/1884901
设计模式之C#实现---- ProtoType
作者: cuike519的专栏 http://blog.csdn.net/cuike519/该模式的意图是:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。那么首先我们应该已经有了一个对象,同时这个对象还支持自我复制(科隆&…

快速排序(二)最后修改
1 //2012-07-162 void quickSort(element list[], int left, int right)//快速排序3 {4 int ileft;5 int jright;6 7 if(i > j) //判断需要i<j8 return;9 10 element templist[i]; 11 12 while(i<j) 13 { 14 while(i<j …
性能超越GPU、FPGA,华人学者提出软件算法架构加速AI实时化
作者 | 王言治,美国东北大学电子与计算机工程系助理教授出品 | AI科技大本营(ID:rgznai100)近年来,机器学习(Machine Learning)领域的研究和发展可谓是与日俱新,各式各样与机器学习相关的研究成果与应用层出不穷&#…

PHP获取毫秒时间戳,利用microtime()函数
PHP获取毫秒时间戳,利用microtime()函数 php本身没有提供返回毫秒数的函数,但提供了一个microtime()函数,借助此函数,可以很容易定义一个返回毫秒数的函数。php的毫秒是没有默认函数的,但提供了一个microtime()函数&am…

.NET中添加控件数组
作者:cuike519的专栏 http://blog.csdn.net/cuike519/添加控件数组 在.NET里面我好像没有找到有关于控件数组的说明,但是前两天偶在网上看到了一篇关于如何在.NET里面实现控件数组的文章(该文章请参看MSDN).记得大学的时候在使用VB的时候使用过控件数组,可是到了…
如何在机器学习的框架里实现隐私保护?
编者按:数据时代,人们从技术中获取便利的同时,也面临着隐私泄露的风险。微软倡导负责任的人工智能,因此机器学习中的隐私保护问题至关重要。本文介绍了目前机器学习中隐私保护领域的最新研究进展,讨论了机密计算、模型…

函数图像轻松画:教你用永中图象
函数图像轻松画:教你用永中图象 函数图像轻松画:教你用永中图象转载于:https://blog.51cto.com/premium/933220

c语言语系的命名风格和java系命名风格
c语言系的命名风格:单词之间使用下划线分隔。如上图。 java语言是另外一个系,javascript属于java语系(当年就是想借助java的名气所以命名javascript)。java语系是驼峰式命名法,如getElementById()。如果使用c语系命名风格则使用下划线分隔 ge…

全国IP地址分配表
xa.sn.cn,西安公众网,西安,陕西,CN,202.100.0.* xa.sn.cn,西安公众网,西安,陕西,CN,202.100.1.* xa.sn.cn,西安公众网,西安,陕西,CN,202.100.2.* xa.sn.cn,西安公众网,西安,陕西,CN,202.100.3.* xa.sn.cn,西安公众网,西安,陕西,CN,202.100.4.* xa.sn.cn,西安公众网,西安,陕西,C…
神同步!美国三地 Tesla 车主,自动驾驶都撞了警车
来源 | HyperAI超神经(ID:HyperAI)内容概要:上周在美国北卡州发生了一起交通事故,一辆自动驾驶模式下的 Tesla 撞击了停靠在路边的警车,虽未造成人员伤亡,但车辆损毁严重。事故调查中发现&#…

Q币才是腾讯真正的世界级产品
本文受《虚拟货币将是下一个大平台》启发而来。何玺认为,腾讯Q币本身就具有全球化虚拟货币的基因。 日前,有媒体报道了Pocket Change获得了由Google Ventures领投的500万美元A轮融资,使其融资总额达到640万美元。 Pocket Change是一个为Andro…

解决Office互操作错误检索COML类工厂中 CLSID为 {xxx}的组件时失败,原因是出现以下错误: 80070005...
Excel为例(其他如Word也适用)文件数据导入时报出以下错误: 检索COML类工厂中 CLSID为 {00024500-0000-0000-C000-000000000046}的组件时失败,原因是出现以下错误: 80070005,如图所示: 可以看到报出的异常类型为:UnauthorizedAcces…

再论制硬盘逻辑锁
姜卓睿 雷必武 一、序言 由于教学工作需要,本人在参看了贵刊98年第4期《硬盘逻辑锁技术研究及应用》与99年第3期《解开硬盘逻辑死锁的一种有效方法》的文章之后,决定以同类方法尝试一下,结果未获得成功,又“苦于”没有KV300 L …
我国科学家成功研制全球神经元规模最大的类脑计算机
来源 | 之江实验室(ID:zhejianglab)9月1日,浙江大学与之江实验室举办成果发布会,共同发布我国首台基于自主知识产权类脑芯片的类脑计算机(Darwin Mouse)。浙江大学校长吴朝晖院士出席并讲话。他…

批处理获取目录下所有文件名
由于要处理一些文件,找了个这样的批处理: 输出目录及子目录下所有的jpg图片的文件名,不含扩展名 1 echo off 2 cd.>List.txt 3 for /f "delims" %%i in (dir /s/a-d /b *.jpg) do >>List.txt echo %%~ni>>JustName.…

1001: 整数求和
描述:求两个整数之和输入:输入数据只包括两个整数A和B。输出:两个整数的和。样例输入:1 2样例输出:3考点:运算符代码: #include <stdio.h> int main() {int a,b;int c;scanf("%d",&a);scanf("%d",&b);cab;printf("%d",…

ASP.NET 2.0 中的新增安全功能
发布日期: 8/26/2004| 更新日期: 8/26/2004Stephen Walther Microsoft Corporation 适用于: Microsoft ASP.NET 2.0 Microsoft ASP.NET framework Microsoft SQL Server Microsoft Visual Studio .NET 摘要:ASP.NET 2.0 包含一些新…
GitHub 标星 20000+,国产 AI 开源从算法开始突破 | 专访商汤联合创始人林达华
作者 | 阿司匹林责编 | 李雪敬封图 | CSDN 下载自视觉中国作为已经有4000多名员工的AI独角兽,商汤的一举一动备受关注。从2018年开始,奔着“开源、统一、可复现”的目标,商汤开始建设人工智能算法的开源体系。当时,商汤联合创始人…

那些年,我们一起学过的汇编----之伪指令
弄懂了前面几篇关于基础的文章,下面就开始我们真正的汇编之旅了,在这一篇中我们着重来强调下汇编语言的伪指令。伪指令是汇编语言程序设计中的一个主要的部分,属于控制命令,在汇编语言中的数据定义、存储单元分配、指示程序结果等…

JavaScript-数据引用类型对象
1 <!DOCTYPE html>2 <html>3 <head lang"en">4 <meta charset"UTF-8">5 <title></title>6 </head>7 <body>8 <script>9 //按值传递:两个变量间赋值时,或将变量作为参数传入函数时,其实…
热点 | Excel不“香”了,数据分析首选Pyhton!
Excel一直在求职中有着不可动摇的地位无论是投行、咨询、四大曾经都会在JD中明确要求会Excel,而Excel称霸的时代已经过去!事实上,为了追求更高的效率和质量,他们开始使用比Excel更高效的Python,随后交易收入增长了15%。…

ASP.NET中实现打印
怎样才可以调用打印机进行打印并且对纸张类型进行设置呢? --------------------------------------------------------------- <OBJECT id"WebBrowser" height"0" width"0" classid"CLSID:8856F961-340A-11D0-A96B-00…
you have new email in /var/spool/mail/root/
有时在进入系统的时候经常提示You have new mail in /var/spool/mail/root 解决方法:修改系统配置文件/etc/profile,告诉系统不要去检查邮箱. 具体操作: 命令行输入:echo "unset MAILCHECK" >> /etc/profile 【把…

写时复制,写时拷贝,写时分裂,Copy on write
2019独角兽企业重金招聘Python工程师标准>>> 写时复制,写时拷贝,写时分裂 (Copy-on-write,简称COW)是计算机资源管理方面的一种优化技术,有着广泛的应用,比如内存管理(进…

C#生成pdf的源代码
作者:qieyj(温馨港湾) http://search.csdn.net/Expert/topic/1256/1256076.xml?temp.1866419//write by wenhui.orgusing System;using System.IO;using System.Text;using System.Collections; namespace PDFGenerator{ public class PDFGenerator{static fl…