<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>学习笔记</title><link>http://blog.vckbase.com/abbey/category/1047.html</link><description>学习过程中的疑惑、心得，如此等等</description><managingEditor>Abbey的小匣子</managingEditor><dc:language>zh-CN</dc:language><generator>.Text Version 0.958.2004.214</generator><item><dc:creator>Abbey的小匣子</dc:creator><title>DataSet点滴</title><link>http://blog.vckbase.com/abbey/articles/24691.html</link><pubDate>Wed, 28 Feb 2007 13:16:00 GMT</pubDate><guid>http://blog.vckbase.com/abbey/articles/24691.html</guid><wfw:comment>http://blog.vckbase.com/abbey/comments/24691.html</wfw:comment><comments>http://blog.vckbase.com/abbey/articles/24691.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blog.vckbase.com/abbey/comments/commentRss/24691.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/abbey/services/trackbacks/24691.html</trackback:ping><description>&lt;FONT face="Courier New" size=2&gt;
&lt;HR id=null&gt;
DataSet是ADO.Net中相当重要的一个类。最近在学习Duwamish的过程中，自己也尝试着利用强类型的DataSet进行数据封装和传递。其间遇到了一些小问题，小结如下：&lt;BR&gt;&lt;BR&gt;将数据封装入一个DataSet对象的典型过程，先New再Add&lt;BR&gt;&lt;BR&gt;
&lt;DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"&gt;
&lt;DIV&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;SPAN style="COLOR: #000000"&gt;MyDataSet&amp;nbsp;ds&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;MyDataSet();&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;MyDataSet.MyTableRow&amp;nbsp;row&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;ds.MyTable.NewMyTableRow();&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;row.ID&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;1&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;row.Name&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;Mike&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;row.Birthday&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;DateTime(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;1985&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;1&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;20&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;);&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;row.Address&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;Road&amp;nbsp;14&amp;nbsp;in&amp;nbsp;Beijing&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;ds.MyTable.AddMyTableRow(row);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;BR&gt;数据按上述形式进行封装后，这个row便已属于该DataSet与Table，因此不能通过dsAnother.AddRow()或以其他方式与其他DataSet建立关联，否则会触发一个异常。&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;
&lt;BR&gt;在DataSet的Table类中有一个Select()方法，该方法返回与指定条件匹配的Row的数组DataRow[]。这个条件用一个字符串表示，形式与Trans-SQL的查询条件构造一致，比如：Name = 'Mike'这样的一个串。Select()有4种重载形式，支持排序条件。使用Select()时需要注意的有几点：&lt;BR&gt;&lt;BR&gt;1. Select()在没有匹配Row时，仍返回一个空的DataRow[]，而不是null。&lt;BR&gt;&lt;BR&gt;
&lt;DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"&gt;
&lt;DIV&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;SPAN style="COLOR: #000000"&gt;MyDataSet.MyTableRow[]&amp;nbsp;result&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;(MyDataSet.MyTableRow[])&amp;nbsp;ds.MyTable.Select(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;Name&amp;nbsp;=&amp;nbsp;'Mike'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;);&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;//&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;错误的检查方式&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;(result&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;==&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;null&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MessageBox.Show(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;No&amp;nbsp;match&amp;nbsp;record&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;);&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;else&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;//&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;IMG src="/Images/dot.gif"&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;//&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;正确的检查方式&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;(result.Length&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;==&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MessageBox.Show(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;No&amp;nbsp;match&amp;nbsp;record.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;);&amp;nbsp;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;else&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;//&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;IMG src="/Images/dot.gif"&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;BR&gt;2. 传递给Select()的查询条件字符串如果不符合语法结构或者无法被解释，会触发两类异常：System.Data.EvaluateException 与 System.Data.SyntaxErrorException。&lt;BR&gt;&lt;BR&gt;你可以试试将上述示例代码中的&amp;#8220;Name = 'Mike'&amp;#8220;改为&amp;#8220;Name = Mike&amp;#8220;(删除Mike两边的单引号)试试。&lt;BR&gt;&lt;BR&gt;3. Select()返回的DataRow[]，其中每个元素Row，仍旧属于该方法所属的DataSet，而不是一份拷贝。因此对这些元素的操作仍旧会改变其源DataSet中的相应内容。MSDN里对这部分没有阐述，害我以为是一份拷贝，瞎折腾了半天。&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;
&lt;BR&gt;利用DataSet读写XML文件时，要注意：&lt;BR&gt;&lt;BR&gt;1. 尽量保证ds.ReadXml()与ds.AcceptChanges()、ds.WriteXml()配对使用。否则重复地使用ds.ReadXML()读入数据会触发一个异常。&lt;BR&gt;&lt;BR&gt;我的异常是在这样的情形下发生的： 在Constructor中调用了一次ReadXml()将已有数据读入一个DataSet，之后在一个方法内部的一开始又不小心调用了一次ReadXml()。&lt;BR&gt;&lt;BR&gt;2. 如果是要利用一个XML文件保存数据，第一次添加数据时，不用ReadXml()，而应直接WriteXml()生成.xml文件。不要尝试自己手工建立一个空白的.xml文件，这可能会触发异常System.Xml.XmlException。&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;这些是我在做练习用的例子时遇到的问题，在本机MSDN中又没有这些提示，都是自己一步步摸索出来的，虽然方法笨了点，不过能省下买什么ADO.Net大全之类书的银子未尝不是件好事。 
&lt;HR id=null&gt;
&lt;BR&gt;*20070807 更新&lt;BR&gt;&lt;BR&gt;四个月的今天晚上，正是老婆在产床上挣扎的时候，回头想来真是百般滋味。这周放假，于是忙里偷闲，又来鼓捣DataSet。在强类型的DataSet里，遇到要访问某一行中某一字段的值时，应该是这样的表达式：&lt;STRONG&gt;DataSet.DataTable[index].ColumnName;&lt;/STRONG&gt;可别象我，傻傻的还用类型转换：&lt;STRONG&gt;((DataSet.DataRow)(DataSet.DataTable.Rows[index])).ColumnName; &lt;BR&gt;&lt;/STRONG&gt;&lt;BR&gt;还有就是在利用DataAdapter进行Fill时，要Fill表，而不是DataSet。即: &lt;STRONG&gt;adapter.Fill(dataset.DataTable);&lt;/STRONG&gt; 而不能是&lt;STRONG&gt; adapter.Fill(dataset);&lt;/STRONG&gt; &lt;BR&gt;&lt;STRONG&gt;
&lt;HR id=null&gt;
&lt;/STRONG&gt;&lt;/FONT&gt;&lt;img src ="http://blog.vckbase.com/abbey/aggbug/24691.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Abbey的小匣子</dc:creator><title>Duwamish 7.0析要</title><link>http://blog.vckbase.com/abbey/articles/24648.html</link><pubDate>Mon, 26 Feb 2007 05:27:00 GMT</pubDate><guid>http://blog.vckbase.com/abbey/articles/24648.html</guid><wfw:comment>http://blog.vckbase.com/abbey/comments/24648.html</wfw:comment><comments>http://blog.vckbase.com/abbey/articles/24648.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.vckbase.com/abbey/comments/commentRss/24648.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/abbey/services/trackbacks/24648.html</trackback:ping><description>&lt;FONT face="Courier New" size=2&gt;
&lt;HR id=null&gt;
VC++6.0企业版提供的多层设计范例Hopper Island News，不知有多少人认真看过，当时正在学习ADO和COM的我，还为此整理了几篇译文。进入了.Net时代，Microsoft出于各种目的，又向我们提供了一个叫做Duwamish的经典示例。 这个模拟网上书店的Duwamish历经了多个版本更迭，现在的最新版本是7.0。其架构模式是典型的B2C模式，UI采用Web，后台的数据库用SQL Server作支持。&lt;BR&gt;&lt;BR&gt;Duwamish 7.0源代码提供了Visual Basic.Net与Visual C#两个版本。要阅读其源码，需要操作系统提供IIS和ASP.Net服务，Visual Studio.Net也需要安装相应的Web开发组件。Duwamish 7.0的安装包在Visual Studio.Net企业版安装目录中下的Enterprise Samples目录中，直接运行后会将源码解压在该目录中。&lt;BR&gt;&lt;BR&gt;安装解压后Duwamish的源码主要分布在Web、SystemFramework、Business\Facade、Business\Rules、Common、Common\Data、DataAccess这几个目录中，其完整的解决方案也是完全按这个目录结构搭建的，在IDE中即可一目了然。DataBase中是安装SQL数据库的脚本文件等。&lt;BR&gt;&lt;BR&gt;在MSDN上有一篇相关的文章，可以对阅读和理解Duwamish的源码有些帮助&amp;#8212;《&lt;/FONT&gt;&lt;A href="http://www.microsoft.com/china/community/program/originalarticles/TechDoc/duwamish.mspx"&gt;&lt;FONT face="Courier New" size=2&gt;Duwamish深入剖析-结构篇&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;》&lt;BR&gt;&lt;BR&gt;学习Duwamish，我只选择了其中的Customer（顾客）管理作为目标，故以下都以其为表述的重心。 
&lt;HR id=null&gt;
&lt;BR&gt;Duwamish的分层&lt;BR&gt;&lt;BR&gt;--UI层 （Web）&lt;BR&gt;&amp;nbsp; ---&amp;gt;Business层&amp;nbsp;（含Facade、Rules、Common、SystemFramework等）&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;---&amp;gt;DataAccess层&amp;nbsp; （DataAccess）&lt;BR&gt;&lt;BR&gt;同时为了在各层间交换顾客数据，建立了一个强类型的DataSet&amp;#8212;&amp;#8212;CustomerData。&lt;BR&gt;&lt;BR&gt;---------------------&lt;BR&gt;&lt;BR&gt;1. 在最底的DataAccess层，使用了一个类&lt;STRONG&gt;Customers&lt;/STRONG&gt;，该类包含一个SqlDataAdapter dsCommand。利用这个Adapter，数据访问对象Customers在取得与数据库的连结后，利用内部生成的若干SqlCommond，调用数据库的存储过程完成数据更新和查询。&lt;BR&gt;&lt;BR&gt;&lt;FONT style="BACKGROUND-COLOR: #f5f5dc" color=#000000&gt;Customers的主要接口：LoadCustomerByEmail()、UpdateCustomer()、InsertCustomer()&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;---------------------&lt;BR&gt;&lt;BR&gt;2. 在Business层中，又细划了几部分：&lt;BR&gt;&lt;BR&gt;&amp;nbsp; (1)直接与UI层Web交互的是BusinessFacade层，BusinessFacade应该说是实质意义上的承上启下的Business层，因为由它负责将UI请求分派给Rules、DataAccess层去实现。&lt;BR&gt;&lt;BR&gt;而Duwamish的主要业务规则放到了BusinessRules层。Rules层的类是&lt;STRONG&gt;Customer&lt;/STRONG&gt;，它要负责检查传递给它的参数是否符合业务规则中的形式要求，以及参数的有效性。当然Customer仍是将数据访问工作交给了DataAccess层的Customers去完成。&lt;BR&gt;&lt;BR&gt;&lt;FONT style="BACKGROUND-COLOR: #f5f5dc"&gt;Customer的主要接口：Insert()、Update()&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp; (2)Facade层的类是&lt;STRONG&gt;CustomerSystem&lt;/STRONG&gt;，它从Web层接收用户输入的数据或者请求，在其内部进行分类：&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; i)查询类操作，直接调用DataAccess层Customers的接口实现。比如GetCustomerByEmail()就调用了Customers.LoadCustomerByEmail()；&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ii)更新、插入类操作，调用Rules层Customer的接口实现。比如CreateCustomer()调用了Customer.Insert()。&lt;BR&gt;&lt;BR&gt;&lt;FONT style="BACKGROUND-COLOR: #f5f5dc"&gt;CustomerSystem的主要接口：GetCustomerByEmail()、UpdateCustomer()、CreateCustomer()&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;在Business层中，还有Common与SystemFramework两个部分。上文中的强类型DataSet&amp;#8212;&amp;#8212;CustomerData就定义在Common中。同时，Common与SystemFramework为保证Duwamish的灵活性以及调试的方便，提供了ApplicationLog、ApplicationAssert、ApplicationConfiguration、DuwamishConfiguration等类，我还未细究。&lt;BR&gt;&lt;BR&gt;---------------------&lt;BR&gt;&lt;BR&gt;3. 作为UI层的Web，自己去看吧。&lt;BR&gt;&lt;BR&gt;毕竟UI要做成什么样的，纯属个人喜好。（老实说，是我看得头疼了，不知该怎么写这部分）&lt;BR&gt;&lt;BR&gt;
&lt;HR id=null&gt;
&lt;BR&gt;Duwamish中的数据传递与异常处理&lt;BR&gt;&lt;BR&gt;在Duwamish各层穿梭的数据，主要以CustomerData形式存在。CustomerData既对应了数据库意义上的DataSet，也反映了问题域上的一个实体。回想自己曾经的设计，经常要在一个问题域对象与数据库对象间建立相互的转换映射，真是汗颜。&lt;BR&gt;&lt;BR&gt;需要注意的是，UI层向其下层传递的参数仍是对应DataSet各字段值的string、int等类型，而不是一个构造好了的DataSet对象。另一方面，UI层却必须要知道如何从下层返回的DataSet对象中提取信息，即UI层对DataSet的结构必定是清楚的。&lt;BR&gt;&lt;BR&gt;---------------------&lt;BR&gt;&lt;BR&gt;在Duwamish的各层，我并没有看到太多的try-catch处理，这与曾经的Hopper Island News有着很大的不同。&lt;BR&gt;&lt;BR&gt;1. DataAccess层的Customers自己负责处理数据库异常，向上层调用者返回象征操作成功与否的true/false，或者CustomerData/null（以下均以bool/null进行表达）。&lt;BR&gt;&lt;BR&gt;2. Business的CustomerSystem、Customer也采用了类似的bool/null方式向上层返回操作结果。但为了提供更丰富的错误信息（不是异常），比如Email地址不唯一等，Rules层的Customer通过设置CustomerData中Row的RowError、ColumnError参数向上层反馈。&lt;BR&gt;
&lt;HR id=null&gt;
&lt;/FONT&gt;&lt;BR&gt;&lt;FONT size=2&gt;*20070811更新&lt;BR&gt;&lt;BR&gt;无意间在网上找到了Rickie Lee的Blog，在那里找到了他写的一系列深入剖析Duwamish的文章，有空好好看看。&lt;BR&gt;&lt;BR&gt;链接：&lt;A href="http://www.cnblogs.com/rickie/category/12456.html"&gt;http://www.cnblogs.com/rickie/category/12456.html&lt;/A&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;img src ="http://blog.vckbase.com/abbey/aggbug/24648.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Abbey的网络日志</dc:creator><title>对Flyweight的认识</title><link>http://blog.vckbase.com/abbey/articles/22332.html</link><pubDate>Fri, 08 Sep 2006 11:00:00 GMT</pubDate><guid>http://blog.vckbase.com/abbey/articles/22332.html</guid><wfw:comment>http://blog.vckbase.com/abbey/comments/22332.html</wfw:comment><comments>http://blog.vckbase.com/abbey/articles/22332.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.vckbase.com/abbey/comments/commentRss/22332.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/abbey/services/trackbacks/22332.html</trackback:ping><description>&lt;FONT face="Courier New" size=2&gt;
&lt;HR id=null&gt;
Flyweight本来是不太复杂的一个Pattern，却因为我看的几本书中都没有详尽的范例，一直不得其解。今天在ProgrammerHeaven上下载了一个示例程序，才恍然大悟。&lt;BR&gt;&lt;BR&gt;Flyweight Pattern是用来有效减少重复性对象的。按我现在的理解，Flyweight Pattern就象是Cache的工作方式，或者说Cache正是Flyweight Pattern的典型应用。&lt;BR&gt;&lt;BR&gt;CPU Cache相信很多人都了解的，包括一些硬件DIYer，而不仅仅是我们这些&amp;#8220;软蛋&amp;#8221;。Cache的工作原理可以简单表述为：CPU需要读取数据Data；CPU首先在Cache中寻找Data；Cache中有Data（被称为&amp;#8220;命中&amp;#8221;），于是Cache将Data传递给CPU；Cache中没有CPU要的Data，Cache从外部存储设备获取Data，并更新Cache本身，将Data存入Cache内部，等待下一次命中。&lt;BR&gt;&lt;BR&gt;对应于Flyweight Pattern（自己找张Flyweight Pattern的结构示意图吧）：&lt;BR&gt;&lt;BR&gt;* CPU是Client；&lt;BR&gt;&lt;BR&gt;* Cache是FlyweightFactory；&lt;BR&gt;&lt;BR&gt;* Data是Flyweight。&lt;BR&gt;&lt;BR&gt;Flyweight Pattern中，Flyweight包括可共享的与不可共享的两类对象。套用关系数据库中的术语，可以这么说：&lt;BR&gt;&lt;BR&gt;* 对于可共享的Flyweight，其内部的数据与状态应当是符合第三范式的（3NF）的，其表达不依赖于其他对象或上下文。&lt;BR&gt;&lt;BR&gt;* 对于不可共享的Flyweight，它则通常是依赖于一个可共享的Flyweight来完成一个更丰富、更完整的表达的。 &lt;BR&gt;&lt;BR&gt;我当时之所以对Flyweight Pattern百思不得其解，是错误地将注意力放到了GoF中可共享的Character对象及存储其字体信息的GlyphContext上了。
&lt;HR id=null&gt;
&lt;/FONT&gt;&lt;img src ="http://blog.vckbase.com/abbey/aggbug/22332.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Abbey的网络日志</dc:creator><title>对Strategy、Template、Bridge的认识</title><link>http://blog.vckbase.com/abbey/articles/22312.html</link><pubDate>Wed, 06 Sep 2006 12:52:00 GMT</pubDate><guid>http://blog.vckbase.com/abbey/articles/22312.html</guid><wfw:comment>http://blog.vckbase.com/abbey/comments/22312.html</wfw:comment><comments>http://blog.vckbase.com/abbey/articles/22312.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.vckbase.com/abbey/comments/commentRss/22312.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/abbey/services/trackbacks/22312.html</trackback:ping><description>&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;
&lt;HR id=null&gt;
&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;Strategy在GoF等人的书中，被阐述为针对同一问题的若干种算法的独立封装。对于Bridge，则被表述为将若干对象方法的实现与对象本身分别封装。&lt;BR&gt;&lt;BR&gt;Strategy、Bridge看似风马牛不相及的两种Pattern，却正是由于二者均表现为将方法的实现与方法所属的对象分别进行封装，而让我迷惑了许久。&lt;BR&gt;&lt;BR&gt;&lt;FONT color=#0000ff size=4&gt;&lt;STRONG&gt;（一）Strategy&lt;/STRONG&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;现在，我理解的Strategy更象是C/C++语言中的头文件.H与库文件.LIB的关系。比如.H中声明的同一个方法malloc()，可能会因为编译模式的选择（Tiny/Small/Large），使malloc()的编译依赖指向不同的.LIB中malloc()的实现，比如malloc_tiny()、malloc_small()、malloc_large()。&lt;BR&gt;&lt;BR&gt;Strategy或者也可以用一个参加宴会的人如何使用餐具作比：参加中式宴会时，使用筷子；参加西式宴会时，使用刀叉。&lt;BR&gt;&lt;BR&gt;在这两个例子里，&amp;#8220;malloc()&amp;#8221;与&amp;#8220;使用餐具&amp;#8221;是Strategy中要被抽象的那个方法；&amp;#8220;编译模式&amp;#8221;与&amp;#8220;宴会类型（中/西）&amp;#8221;是Strategy中的Configuration对象；malloc_tiny()、&amp;#8220;使用筷子&amp;#8221;、&amp;#8220;使用刀叉&amp;#8221;则分别是派生的ConcreteStrategy对象。最后由&amp;#8220;参加宴会的人&amp;#8221;根据自己参加的是中式亦或西式的宴会（获取Configuration对象），决定是&amp;#8220;使用筷子&amp;#8221;还是&amp;#8220;使用刀叉&amp;#8221;（创建对应的ConcreteStrategy对象）。&lt;BR&gt;&lt;BR&gt;在Strategy Pattern中，一个Strategy对象总是与一个方法Method()对应的，若干个派生的Strategy对象间是互斥的，所有的ConcreteStrategy对象都只能属于同一个Method()。换句话说，任一时刻Method()只能是指向其中的一个Strategy对象。&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;&lt;FONT color=#0000ff size=4&gt;（二）Template&lt;/FONT&gt;&lt;/STRONG&gt;&lt;BR&gt;&lt;BR&gt;Template也是将方法与其实现相剥离的一种Pattern，它只是在Strategy的基础上作出了更多的限制&amp;#8212;&amp;#8212;预定义了方法的具体实现步骤。可以理解为，Strategy只是将Method()与Method_Imp()进行了剥离，而Template是将Method()表示为Method_Imp()后，继续将Method_Imp()割裂为Method_Imp_Step1()、Method_Imp_Step2()、Method_Imp_Step3()等。&lt;BR&gt;&lt;BR&gt;在Martin的Head First一书里，用泡咖啡与泡柠檬茶对Template Pattern做了最形象的比喻。泡咖啡或是泡茶，都要经过几个步骤：烧水-&amp;gt;放入咖啡/茶叶-&amp;gt;把泡好的咖啡/茶盛入杯子-&amp;gt;加奶/柠檬。于是在Template中，他定义了BoilWater()-&amp;gt;Brew()-&amp;gt;PourInCup()-&amp;gt;AddCondiments()这么一个顺序，构成一个完成的泡制饮品的方法，区别的只是泡茶时Brew()放的是茶，AddCondiments()时放的是柠檬。&lt;BR&gt;&lt;BR&gt;我时常在想，为什么国内的专家们就不能举出这么简单的例子，让我们一下就明白Pattern是什么呢？他们要不把简单的问题复杂化，要不就照抄别人的例子。&lt;IMG height=20 src="/Emoticons/QQ/13.gif" width=20 border=0&gt;&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;&lt;FONT color=#0000ff size=4&gt;（三）Bridge&lt;/FONT&gt;&lt;/STRONG&gt;&lt;BR&gt;&lt;BR&gt;曾经以为自己对Bridge的理解是最为深刻的，因为这是《Design Pattern Explained》奉上的第一个颇具挑战性的Pattern。直到学习了Strategy之后，我才发现之前的认识是错误的&amp;#8212;&amp;#8212;我混淆了Bridge与Strategy。现在，我认识到：&lt;BR&gt;&lt;BR&gt;1. Bridge反映的是一组对象Abstraction与另一组对象Implementation之间的关系，Abstraction与Implementation分别有若干个派生类。&lt;BR&gt;&lt;BR&gt;　Strategy反映的是一个方法Method()与一组ConcreteStrategy对象之间的关系，这种关系需要Configuration对象的介入。&lt;BR&gt;&lt;BR&gt;2. Bridge中Abstraction.Method()对应的可能是Implementation.Method_1()一个方法，也可能是Implementation.Method_1()+Implementation.Method_2()这样的组合；Implementation为Abstraction提供&amp;#8220;方法的实现素材&amp;#8221;，Abstraction.Method()不是简单地调用Implementation.Method()，Abstraction.Method()中可能还包括自己的一部分实现。&lt;BR&gt;&lt;BR&gt;　Strategy中Method()只能是对应某一个ConcreteStrategy.Method()。&lt;BR&gt;&lt;BR&gt;3. Bridge中Abstraction.Method()与Implementation.Method()的对应关系是在设计时就确定了的。即假设派生于Abstraction的A.Method()被确定利用Implementation.Method_A()来实现其操作，那么无论这个Implementation是具体的Imp_One还是Imp_Two对象，A.Method()中都只能使用Imp_One或者Imp_Two的Method_A()，尽管Imp_One、Imp_Two可能还包括Method_B()之类的方法。&lt;BR&gt;&lt;BR&gt;　Strategy中Method()究竟与哪一个ConcreteStrategy.Method()对应是可以在运行时利用Configuration对象来改变映射关系的。&lt;BR&gt;&lt;BR&gt;《Design Pattern Explained》一书中，使用不同版本的绘图设备Drawing（Implementation）绘制各种Shape（Abstraction）是理解Bridge Pattern很好的一个例子，作者也有很详尽的讲解。&lt;BR&gt;
&lt;HR id=null&gt;
&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;img src ="http://blog.vckbase.com/abbey/aggbug/22312.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Abbey的网络日志</dc:creator><title>对State Pattern的认识</title><link>http://blog.vckbase.com/abbey/articles/22188.html</link><pubDate>Fri, 01 Sep 2006 10:39:00 GMT</pubDate><guid>http://blog.vckbase.com/abbey/articles/22188.html</guid><wfw:comment>http://blog.vckbase.com/abbey/comments/22188.html</wfw:comment><comments>http://blog.vckbase.com/abbey/articles/22188.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.vckbase.com/abbey/comments/commentRss/22188.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/abbey/services/trackbacks/22188.html</trackback:ping><description>&lt;FONT face="Courier New" size=2&gt;
&lt;HR id=null&gt;
State Pattern的作用，主要是将对象的状态抽象出来，避免状态与对象的紧耦合。还是看一个很简单的例子吧。&lt;BR&gt;&lt;BR&gt;这是一台Machine，假设有Running、Paused、Stopped三种状态，这三种状态间由Machine的Start()、Pause()、Resume()、Stop()这几种方法进行改变。&lt;BR&gt;&lt;BR&gt;&lt;IMG id=ViewPicture.ascx_GalleryImage alt=Machine的状态图 src="/images/vckbase_com/abbey/79/r_State.JPG"&gt;&lt;BR&gt;&lt;BR&gt;以下是这个示例的C#代码，同样的，我又省略了许多。这个例子真的简单，仔细理解注释以及整个类与类形成的State Pattern的结构是关键。&lt;BR&gt;&lt;/FONT&gt;
&lt;DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"&gt;
&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;interface&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;State&lt;BR&gt;&lt;IMG id=Codehighlighter1_23_100_Open_Image onclick="this.style.display='none'; Codehighlighter1_23_100_Open_Text.style.display='none'; Codehighlighter1_23_100_Closed_Image.style.display='inline'; Codehighlighter1_23_100_Closed_Text.style.display='inline';" src="/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top&gt;&lt;IMG id=Codehighlighter1_23_100_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_23_100_Closed_Text.style.display='none'; Codehighlighter1_23_100_Open_Image.style.display='inline'; Codehighlighter1_23_100_Open_Text.style.display='inline';" src="/Images/OutliningIndicators/ContractedBlock.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_23_100_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"&gt;&lt;IMG src="/Images/dot.gif"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN id=Codehighlighter1_23_100_Open_Text&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;//&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;导致状态改变的所有方法&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;Start();&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;Pause();&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;Resume();&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;Stop();&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top&gt;}&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #008000"&gt;//&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;每一个状态对应一个State的派生类，在该类中以其对应状态为源点，实现转换至其他状态时的方法&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;class&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;Running&amp;nbsp;:&amp;nbsp;State&lt;BR&gt;&lt;IMG id=Codehighlighter1_181_632_Open_Image onclick="this.style.display='none'; Codehighlighter1_181_632_Open_Text.style.display='none'; Codehighlighter1_181_632_Closed_Image.style.display='inline'; Codehighlighter1_181_632_Closed_Text.style.display='inline';" src="/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top&gt;&lt;IMG id=Codehighlighter1_181_632_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_181_632_Closed_Text.style.display='none'; Codehighlighter1_181_632_Open_Image.style.display='inline'; Codehighlighter1_181_632_Open_Text.style.display='inline';" src="/Images/OutliningIndicators/ContractedBlock.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_181_632_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"&gt;&lt;IMG src="/Images/dot.gif"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN id=Codehighlighter1_181_632_Open_Text&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;Machine&amp;nbsp;m_machine&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;null&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;Running(Machine&amp;nbsp;mac)&lt;BR&gt;&lt;IMG id=Codehighlighter1_250_272_Open_Image onclick="this.style.display='none'; Codehighlighter1_250_272_Open_Text.style.display='none'; Codehighlighter1_250_272_Closed_Image.style.display='inline'; Codehighlighter1_250_272_Closed_Text.style.display='inline';" src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top&gt;&lt;IMG id=Codehighlighter1_250_272_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_250_272_Closed_Text.style.display='none'; Codehighlighter1_250_272_Open_Image.style.display='inline'; Codehighlighter1_250_272_Open_Text.style.display='inline';" src="/Images/OutliningIndicators/ContractedSubBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_250_272_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"&gt;&lt;IMG src="/Images/dot.gif"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN id=Codehighlighter1_250_272_Open_Text&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_machine&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;mac;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #008000"&gt;//&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;以Running为源点的方法，只有Pause()、Stop()&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;Start()&lt;BR&gt;&lt;IMG id=Codehighlighter1_333_366_Open_Image onclick="this.style.display='none'; Codehighlighter1_333_366_Open_Text.style.display='none'; Codehighlighter1_333_366_Closed_Image.style.display='inline'; Codehighlighter1_333_366_Closed_Text.style.display='inline';" src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top&gt;&lt;IMG id=Codehighlighter1_333_366_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_333_366_Closed_Text.style.display='none'; Codehighlighter1_333_366_Open_Image.style.display='inline'; Codehighlighter1_333_366_Open_Text.style.display='inline';" src="/Images/OutliningIndicators/ContractedSubBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_333_366_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"&gt;&lt;IMG src="/Images/dot.gif"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN id=Codehighlighter1_333_366_Open_Text&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;//&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;在Running状态下，不支持Start()方法&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&lt;IMG src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;Pause()&lt;BR&gt;&lt;IMG id=Codehighlighter1_392_467_Open_Image onclick="this.style.display='none'; Codehighlighter1_392_467_Open_Text.style.display='none'; Codehighlighter1_392_467_Closed_Image.style.display='inline'; Codehighlighter1_392_467_Closed_Text.style.display='inline';" src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top&gt;&lt;IMG id=Codehighlighter1_392_467_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_392_467_Closed_Text.style.display='none'; Codehighlighter1_392_467_Open_Image.style.display='inline'; Codehighlighter1_392_467_Open_Text.style.display='inline';" src="/Images/OutliningIndicators/ContractedSubBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_392_467_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"&gt;&lt;IMG src="/Images/dot.gif"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN id=Codehighlighter1_392_467_Open_Text&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;Paused.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;FONT face="Courier New" size=2&gt;);&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_machine.SetState(m_machine.Paused);&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;Resume()&lt;BR&gt;&lt;IMG id=Codehighlighter1_494_528_Open_Image onclick="this.style.display='none'; Codehighlighter1_494_528_Open_Text.style.display='none'; Codehighlighter1_494_528_Closed_Image.style.display='inline'; Codehighlighter1_494_528_Closed_Text.style.display='inline';" src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top&gt;&lt;IMG id=Codehighlighter1_494_528_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_494_528_Closed_Text.style.display='none'; Codehighlighter1_494_528_Open_Image.style.display='inline'; Codehighlighter1_494_528_Open_Text.style.display='inline';" src="/Images/OutliningIndicators/ContractedSubBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_494_528_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"&gt;&lt;IMG src="/Images/dot.gif"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN id=Codehighlighter1_494_528_Open_Text&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;//&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;在Running状态下，不支持Resume()方法&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&lt;IMG src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;Stop()&lt;BR&gt;&lt;IMG id=Codehighlighter1_553_630_Open_Image onclick="this.style.display='none'; Codehighlighter1_553_630_Open_Text.style.display='none'; Codehighlighter1_553_630_Closed_Image.style.display='inline'; Codehighlighter1_553_630_Closed_Text.style.display='inline';" src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top&gt;&lt;IMG id=Codehighlighter1_553_630_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_553_630_Closed_Text.style.display='none'; Codehighlighter1_553_630_Open_Image.style.display='inline'; Codehighlighter1_553_630_Open_Text.style.display='inline';" src="/Images/OutliningIndicators/ContractedSubBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_553_630_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"&gt;&lt;IMG src="/Images/dot.gif"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN id=Codehighlighter1_553_630_Open_Text&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;Stopped.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;FONT face="Courier New" size=2&gt;);&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_machine.SetState(m_machine.Stopped);&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&lt;IMG src="/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top&gt;}&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;class&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;Paused&amp;nbsp;:&amp;nbsp;State&lt;BR&gt;&lt;IMG id=Codehighlighter1_663_688_Open_Image onclick="this.style.display='none'; Codehighlighter1_663_688_Open_Text.style.display='none'; Codehighlighter1_663_688_Closed_Image.style.display='inline'; Codehighlighter1_663_688_Closed_Text.style.display='inline';" src="/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top&gt;&lt;IMG id=Codehighlighter1_663_688_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_663_688_Closed_Text.style.display='none'; Codehighlighter1_663_688_Open_Image.style.display='inline'; Codehighlighter1_663_688_Open_Text.style.display='inline';" src="/Images/OutliningIndicators/ContractedBlock.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_663_688_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"&gt;&lt;IMG src="/Images/dot.gif"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN id=Codehighlighter1_663_688_Open_Text&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;//&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;需要实现Resume()、Stop()&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&lt;IMG src="/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;FONT face="Courier New" size=2&gt;}&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;class&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;Stopped&amp;nbsp;:&amp;nbsp;State&lt;BR&gt;&lt;IMG id=Codehighlighter1_720_737_Open_Image onclick="this.style.display='none'; Codehighlighter1_720_737_Open_Text.style.display='none'; Codehighlighter1_720_737_Closed_Image.style.display='inline'; Codehighlighter1_720_737_Closed_Text.style.display='inline';" src="/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top&gt;&lt;IMG id=Codehighlighter1_720_737_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_720_737_Closed_Text.style.display='none'; Codehighlighter1_720_737_Open_Image.style.display='inline'; Codehighlighter1_720_737_Open_Text.style.display='inline';" src="/Images/OutliningIndicators/ContractedBlock.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_720_737_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"&gt;&lt;IMG src="/Images/dot.gif"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN id=Codehighlighter1_720_737_Open_Text&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;//&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;需要实现Start()&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&lt;IMG src="/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;FONT face="Courier New" size=2&gt;}&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;class&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;Machine&lt;BR&gt;&lt;IMG id=Codehighlighter1_761_1430_Open_Image onclick="this.style.display='none'; Codehighlighter1_761_1430_Open_Text.style.display='none'; Codehighlighter1_761_1430_Closed_Image.style.display='inline'; Codehighlighter1_761_1430_Closed_Text.style.display='inline';" src="/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top&gt;&lt;IMG id=Codehighlighter1_761_1430_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_761_1430_Closed_Text.style.display='none'; Codehighlighter1_761_1430_Open_Image.style.display='inline'; Codehighlighter1_761_1430_Open_Text.style.display='inline';" src="/Images/OutliningIndicators/ContractedBlock.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_761_1430_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"&gt;&lt;IMG src="/Images/dot.gif"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN id=Codehighlighter1_761_1430_Open_Text&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;//&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;为每一种状态准备一个State对象，需要为这些对象都提供一个Property&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;Running&amp;nbsp;m_running&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;Running();&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;Paused&amp;nbsp;m_paused&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;Paused();&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;Stopped&amp;nbsp;m_stopped&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;Stopped();&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;State&amp;nbsp;Running&lt;BR&gt;&lt;IMG id=Codehighlighter1_964_1002_Open_Image onclick="this.style.display='none'; Codehighlighter1_964_1002_Open_Text.style.display='none'; Codehighlighter1_964_1002_Closed_Image.style.display='inline'; Codehighlighter1_964_1002_Closed_Text.style.display='inline';" src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top&gt;&lt;IMG id=Codehighlighter1_964_1002_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_964_1002_Closed_Text.style.display='none'; Codehighlighter1_964_1002_Open_Image.style.display='inline'; Codehighlighter1_964_1002_Open_Text.style.display='inline';" src="/Images/OutliningIndicators/ContractedSubBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_964_1002_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"&gt;&lt;IMG src="/Images/dot.gif"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN id=Codehighlighter1_964_1002_Open_Text&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;get&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&lt;IMG id=Codehighlighter1_974_999_Open_Image onclick="this.style.display='none'; Codehighlighter1_974_999_Open_Text.style.display='none'; Codehighlighter1_974_999_Closed_Image.style.display='inline'; Codehighlighter1_974_999_Closed_Text.style.display='inline';" src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top&gt;&lt;IMG id=Codehighlighter1_974_999_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_974_999_Closed_Text.style.display='none'; Codehighlighter1_974_999_Open_Image.style.display='inline'; Codehighlighter1_974_999_Open_Text.style.display='inline';" src="/Images/OutliningIndicators/ContractedSubBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_974_999_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"&gt;&lt;FONT face="Courier New" size=2&gt;&lt;IMG src="/Images/dot.gif"&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_974_999_Open_Text&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;m_running;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&lt;IMG src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT face="Courier New" size=2&gt;//&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #008000"&gt;还有Property&amp;nbsp;Paused与Stopped在此定义&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;//&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;初始状态为Stopped&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;State&amp;nbsp;m_state&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;m_stopped;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;SetState(State&amp;nbsp;st)&lt;BR&gt;&lt;IMG id=Codehighlighter1_1127_1146_Open_Image onclick="this.style.display='none'; Codehighlighter1_1127_1146_Open_Text.style.display='none'; Codehighlighter1_1127_1146_Closed_Image.style.display='inline'; Codehighlighter1_1127_1146_Closed_Text.style.display='inline';" src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top&gt;&lt;IMG id=Codehighlighter1_1127_1146_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1127_1146_Closed_Text.style.display='none'; Codehighlighter1_1127_1146_Open_Image.style.display='inline'; Codehighlighter1_1127_1146_Open_Text.style.display='inline';" src="/Images/OutliningIndicators/ContractedSubBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_1127_1146_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"&gt;&lt;IMG src="/Images/dot.gif"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN id=Codehighlighter1_1127_1146_Open_Text&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_state&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;st;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;PressStart()&lt;BR&gt;&lt;IMG id=Codehighlighter1_1177_1199_Open_Image onclick="this.style.display='none'; Codehighlighter1_1177_1199_Open_Text.style.display='none'; Codehighlighter1_1177_1199_Closed_Image.style.display='inline'; Codehighlighter1_1177_1199_Closed_Text.style.display='inline';" src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top&gt;&lt;IMG id=Codehighlighter1_1177_1199_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1177_1199_Closed_Text.style.display='none'; Codehighlighter1_1177_1199_Open_Image.style.display='inline'; Codehighlighter1_1177_1199_Open_Text.style.display='inline';" src="/Images/OutliningIndicators/ContractedSubBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_1177_1199_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"&gt;&lt;IMG src="/Images/dot.gif"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN id=Codehighlighter1_1177_1199_Open_Text&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;FONT face="Courier New" size=2&gt;{&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_state.Start();&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;bool&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;m_pausedown&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;false&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;PressPause()&lt;BR&gt;&lt;IMG id=Codehighlighter1_1265_1377_Open_Image onclick="this.style.display='none'; Codehighlighter1_1265_1377_Open_Text.style.display='none'; Codehighlighter1_1265_1377_Closed_Image.style.display='inline'; Codehighlighter1_1265_1377_Closed_Text.style.display='inline';" src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top&gt;&lt;IMG id=Codehighlighter1_1265_1377_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1265_1377_Closed_Text.style.display='none'; Codehighlighter1_1265_1377_Open_Image.style.display='inline'; Codehighlighter1_1265_1377_Open_Text.style.display='inline';" src="/Images/OutliningIndicators/ContractedSubBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_1265_1377_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"&gt;&lt;IMG src="/Images/dot.gif"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN id=Codehighlighter1_1265_1377_Open_Text&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;(m_pausedown&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;==&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;false&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_state.Pause();&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;else&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_state.Resume();&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_pausedown&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;~&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;FONT face="Courier New" size=2&gt;m_pausedown;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;PressStop()&lt;BR&gt;&lt;IMG id=Codehighlighter1_1407_1428_Open_Image onclick="this.style.display='none'; Codehighlighter1_1407_1428_Open_Text.style.display='none'; Codehighlighter1_1407_1428_Closed_Image.style.display='inline'; Codehighlighter1_1407_1428_Closed_Text.style.display='inline';" src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top&gt;&lt;IMG id=Codehighlighter1_1407_1428_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1407_1428_Closed_Text.style.display='none'; Codehighlighter1_1407_1428_Open_Image.style.display='inline'; Codehighlighter1_1407_1428_Open_Text.style.display='inline';" src="/Images/OutliningIndicators/ContractedSubBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_1407_1428_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"&gt;&lt;IMG src="/Images/dot.gif"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN id=Codehighlighter1_1407_1428_Open_Text&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;FONT face="Courier New" size=2&gt;{&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_state.Stop();&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&lt;IMG src="/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top&gt;}&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;本文到此结束
&lt;HR id=null&gt;
&lt;/FONT&gt;&lt;img src ="http://blog.vckbase.com/abbey/aggbug/22188.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Abbey的网络日志</dc:creator><title>对Command Pattern的认识</title><link>http://blog.vckbase.com/abbey/articles/22159.html</link><pubDate>Wed, 30 Aug 2006 14:48:00 GMT</pubDate><guid>http://blog.vckbase.com/abbey/articles/22159.html</guid><wfw:comment>http://blog.vckbase.com/abbey/comments/22159.html</wfw:comment><comments>http://blog.vckbase.com/abbey/articles/22159.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blog.vckbase.com/abbey/comments/commentRss/22159.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/abbey/services/trackbacks/22159.html</trackback:ping><description>&lt;img src ="http://blog.vckbase.com/abbey/aggbug/22159.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Abbey的小匣子</dc:creator><title>对创建型Design Pattern的认识</title><link>http://blog.vckbase.com/abbey/articles/22156.html</link><pubDate>Wed, 30 Aug 2006 14:30:00 GMT</pubDate><guid>http://blog.vckbase.com/abbey/articles/22156.html</guid><wfw:comment>http://blog.vckbase.com/abbey/comments/22156.html</wfw:comment><comments>http://blog.vckbase.com/abbey/articles/22156.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blog.vckbase.com/abbey/comments/commentRss/22156.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/abbey/services/trackbacks/22156.html</trackback:ping><description>&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;
&lt;HR id=null&gt;
最近在学习Design Pattern，主要阅读的书包括：&lt;/FONT&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT face="Courier New" size=2&gt;GoF，Design Patterns: Elements of Reusable Object-Oriented Software &lt;/FONT&gt;
&lt;LI&gt;&lt;FONT face="Courier New" size=2&gt;Shalloway，Design Patterns Explained: A New Perspective on Object Oriented Design &lt;/FONT&gt;
&lt;LI&gt;&lt;FONT face="Courier New" size=2&gt;Freeman，Head First Design Patterns &lt;/FONT&gt;
&lt;LI&gt;&lt;FONT face="Courier New" size=2&gt;Martin，Agile Software Development: Principles, Patterns, Practices&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;为什么会同时读这几本书？原因很简单&amp;#8212;&amp;#8212;因为上述任一本书都没有能把常见的Design Pattern讲清楚。&lt;/FONT&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT face="Courier New" size=2&gt;GoF的那本失于晦涩难懂，缺乏阐述，对于入门者实在不合适。我一直在想，为什么该书没有先讲解各种Design Pattern的结构和适用场景，而先是引入了一个Solution，看得我云里雾里的。 &lt;/FONT&gt;
&lt;LI&gt;&lt;FONT face="Courier New" size=2&gt;Shalloway的写得不错，结构安排也合理，但是介绍的Design Pattern少了点，书中大量充斥的笔误和错误代码也使之减色不少。 &lt;/FONT&gt;
&lt;LI&gt;&lt;FONT face="Courier New" size=2&gt;Freeman的是本很有趣的书，文笔也很俏皮。这是一本适合初学者的书，书中的每个Design Pattern都由一个很简单的实际应用逐渐引入，并且每章都有练习题（包括填字游戏）。不过我认为300页就能完成的书也因此用了近700页，看得有点累。 &lt;/FONT&gt;
&lt;LI&gt;&lt;FONT face="Courier New" size=2&gt;Martin的书是一本中级以后可以阅读的书，前面几章的内容略显枯燥，但仔细的阅读可以让你重新认识Object-Oriented Design，对提高自己对问题域的分析能力以及与团队的沟通能力会有一定的帮助。&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;FONT face="Courier New" size=2&gt;
&lt;HR id=null&gt;
回到正题，在GoF的书中，列出了以下几种创建型的Design Pattern： &lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT face="Courier New" size=2&gt;Factory Method &lt;/FONT&gt;
&lt;LI&gt;&lt;FONT face="Courier New" size=2&gt;Abstract Factory &lt;/FONT&gt;
&lt;LI&gt;&lt;FONT face="Courier New" size=2&gt;Builder &lt;/FONT&gt;
&lt;LI&gt;&lt;FONT face="Courier New" size=2&gt;Prototype &lt;/FONT&gt;
&lt;LI&gt;&lt;FONT face="Courier New" size=2&gt;Singleton&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;对于创建型的Pattern，我们可以这样理解。假设Client（顾客）需要获取一个Shoe（产品）对象，通常的方式是这样的：&lt;BR&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"&gt;
&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;Shoe&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;shoe&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;Shoe();&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;而Pattern的引入，就是在Client与Shoe之间插入一个生产者（创造者、工厂）Factory，于是上述的一个new操作变成了一系列的调用过程：&lt;/FONT&gt;&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"&gt;
&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;SPAN style="COLOR: #008000"&gt;//&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;Client中&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;Factory&amp;nbsp;fact&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;Factory();&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;Shoe&amp;nbsp;shoe&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;fact.CreateShoe();&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;//&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;Factory中&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&lt;FONT face="Courier New" size=2&gt;public&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;Shoe&amp;nbsp;CreateShoe()&lt;BR&gt;&lt;IMG id=Codehighlighter1_119_147_Open_Image onclick="this.style.display='none'; Codehighlighter1_119_147_Open_Text.style.display='none'; Codehighlighter1_119_147_Closed_Image.style.display='inline'; Codehighlighter1_119_147_Closed_Text.style.display='inline';" src="/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top&gt;&lt;IMG id=Codehighlighter1_119_147_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_119_147_Closed_Text.style.display='none'; Codehighlighter1_119_147_Open_Image.style.display='inline'; Codehighlighter1_119_147_Open_Text.style.display='inline';" src="/Images/OutliningIndicators/ContractedBlock.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_119_147_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"&gt;&lt;IMG src="/Images/dot.gif"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN id=Codehighlighter1_119_147_Open_Text&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;Shoe();&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top&gt;}&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&lt;STRONG&gt;&lt;FONT style="BACKGROUND-COLOR: #ffff00"&gt;上述代码表现出来的Client---&amp;gt;Factory---&amp;gt;Shoe之间的关系，正是这些Pattern要实现的，只是各自实现的细节和方法不一样而已。&lt;BR&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&lt;BR&gt;&lt;FONT size=3&gt;&lt;FONT color=#0000ff&gt;&lt;STRONG&gt;&lt;FONT size=2&gt;（一）&lt;/FONT&gt;&lt;FONT size=4&gt;Singleton&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;Singleton是比较简单的，其作用就是保证对象的全局性唯一，即任一时刻只有一个实例对象存在。由其引申出的还有适用于多线程的Double-Checked Locking Pattern。下面这段C#代码是Singleton的一个典型实现：&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"&gt;
&lt;DIV&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;class&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;Singleton&lt;BR&gt;&lt;IMG id=Codehighlighter1_23_199_Open_Image onclick="this.style.display='none'; Codehighlighter1_23_199_Open_Text.style.display='none'; Codehighlighter1_23_199_Closed_Image.style.display='inline'; Codehighlighter1_23_199_Closed_Text.style.display='inline';" src="/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top&gt;&lt;IMG id=Codehighlighter1_23_199_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_23_199_Closed_Text.style.display='none'; Codehighlighter1_23_199_Open_Image.style.display='inline'; Codehighlighter1_23_199_Open_Text.style.display='inline';" src="/Images/OutliningIndicators/ContractedBlock.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_23_199_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"&gt;&lt;IMG src="/Images/dot.gif"&gt;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_23_199_Open_Text&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;static&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;Singleton&amp;nbsp;m_Instance&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;Singleton();&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;Singleton()&lt;BR&gt;&lt;IMG id=Codehighlighter1_113_115_Open_Image onclick="this.style.display='none'; Codehighlighter1_113_115_Open_Text.style.display='none'; Codehighlighter1_113_115_Closed_Image.style.display='inline'; Codehighlighter1_113_115_Closed_Text.style.display='inline';" src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top&gt;&lt;IMG id=Codehighlighter1_113_115_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_113_115_Closed_Text.style.display='none'; Codehighlighter1_113_115_Open_Image.style.display='inline'; Codehighlighter1_113_115_Open_Text.style.display='inline';" src="/Images/OutliningIndicators/ContractedSubBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_113_115_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"&gt;&lt;IMG src="/Images/dot.gif"&gt;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_113_115_Open_Text&gt;&lt;SPAN style="COLOR: #000000"&gt;{;}&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;static&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;Singleton&amp;nbsp;GetInstance()&lt;BR&gt;&lt;IMG id=Codehighlighter1_164_197_Open_Image onclick="this.style.display='none'; Codehighlighter1_164_197_Open_Text.style.display='none'; Codehighlighter1_164_197_Closed_Image.style.display='inline'; Codehighlighter1_164_197_Closed_Text.style.display='inline';" src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top&gt;&lt;IMG id=Codehighlighter1_164_197_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_164_197_Closed_Text.style.display='none'; Codehighlighter1_164_197_Open_Image.style.display='inline'; Codehighlighter1_164_197_Open_Text.style.display='inline';" src="/Images/OutliningIndicators/ContractedSubBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_164_197_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"&gt;&lt;IMG src="/Images/dot.gif"&gt;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_164_197_Open_Text&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;m_Instance;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top&gt;}&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;有意者请参阅此文：&lt;/FONT&gt;&lt;A href="http://www-128.ibm.com/developerworks/java/library/j-dcl.html"&gt;&lt;FONT face="Courier New" size=2&gt;Double-checked locking and the Singleton Pattern&lt;/FONT&gt;&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&lt;STRONG&gt;&lt;FONT color=#0000ff&gt;（二）&lt;FONT size=4&gt;Factory Method&lt;/FONT&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;&lt;/STRONG&gt;在Factory Method中，Factory与Shoe存在一一对应的关系。这次复杂点，假设Client要获取男鞋ShoeForMale与女鞋ShoeForFemale，则必定存在均派生于Factory的FactoryMale与FactoryFemale两个工厂，其中FactoryMale为Client创建ShoeForMale对象，FactoryFemale为Client创建ShoeForFemale对象。&lt;BR&gt;&lt;BR&gt;至于选择FactoryMale亦或FactoryFemale，则是由Client负责并选择的。一旦选定了某一Factory，就可以调用一致的factory.CreateShoe()方法来创建Shoe对象了。&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;&lt;STRONG&gt;（三）&lt;FONT size=4&gt;Abstract Factory&lt;/FONT&gt;&lt;/STRONG&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;BR&gt;理解了Factory Method，我们可以把Abstract Factory看作其扩展的结果，或者说Factory Method是Abstract Factory退化的结果。与Factory Method不同的是，Abstract Factory能为Client返回的，总是多种不同的对象，同时这些对象之间总是存在Family（族）的关系，这些对象总是&amp;#8220;同生共死&amp;#8221;，只能生活在&amp;#8220;同一片天空下&amp;#8221;。这样说可能不太好理解，还是用一个通俗的例子进行说明吧。&lt;BR&gt;&lt;BR&gt;假设这一次Client需要的是Shoe与Socks，那么Factory肯定要提供CreateShoe()与CreateSocks()两个方法为之服务。但是想想，一位男士也许不会愿意去穿一位女士的鞋或袜子吧，呵呵。所以这回对Factory得有一定的限制了，因此FactoryMale生产ShoeForMale，那么它能生产的Socks也只能是SocksForMale。同样的，FactoryFemale能生产的也只能是ShoeForFemale与SocksForFemale。&lt;BR&gt;&lt;BR&gt;在上面这个Shoe与Socks的例子中，我们也许发现了ShoeForMale、&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff"&gt;ShoeForFemale均派生于Shoe，而SocksForMale、SocksForFemale则派生于Socks。于是我们可能会认为，Abstract Factory为Client返回的，只能是A1+B1或者A2+B2这样的产品配对，即必有A&amp;lt;-&amp;gt;B这样的对应关系。而这也正体现了&lt;FONT style="BACKGROUND-COLOR: #ffff00"&gt;Abstract Factory得以适用的主要场景&amp;#8212;&amp;#8212;在不同平台间进行移植&lt;/FONT&gt;。&lt;BR&gt;&lt;/FONT&gt;&lt;BR&gt;但是，在GoF的书中为我们提供的例子，却出现了A1+B1、A1+C1、A2+B1这样的一些配对。即出现了Client要求A、B、C对象，而有的Factory只返回A与C，而没有B的现象。&lt;BR&gt;&lt;BR&gt;在他的例子里，MazeFactory通过MakeMaze()、MakeRoom()、MakeWall()、MakeDoor()等接口方法能为Client提供Maze、Room、Wall与Door对象。要注意的是，Wall、Door是Room对象的组成部分，Room又成为Maze的组成部分。正是这种彼此包含的关系，体现在派生的BombedMazeFactory中后，就只实现了MakeMaze()、MakeWall()与MakeRoom()方法，而没有Door对象向Client提供。&lt;BR&gt;&lt;BR&gt;他为什么可以这样做？或者说为什么要这样做呢？这是因为存在前述对象间的包含关系，使得Client要负责用获取的Door、Wall对象去构造Room对象，然后再用构造好的Room对象去构造Maze对象。而我之前理解的，则是认为既然是MazeFactory，必定是为Client返回好一个构造好了的Maze。正是这样的矛盾让我困惑了许久，那段时间确实很痛苦。所以就我个人认为，GoF书中这样应用Abstract Factory即便能体现Pattern适用的灵活性，却也是不严谨的。&lt;BR&gt;&lt;BR&gt;&lt;FONT color=#0000ff&gt;&lt;STRONG&gt;（四）&lt;FONT size=4&gt;Prototype&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;这是一个比较简单的创建型Pattern。它就象一个仓库，里面已经有了我们需要的产品样本，我们要做的只是Clone或者说Copy一个。所以应用这个Pattern的关键，在于设计好这个样本，包括这个样本的各种Property、状态等等。然后为其设计一个恰当的接口方法Clone()。&lt;BR&gt;&lt;BR&gt;每当Client要获取一个Shoe对象时，由于Shoe的每个实例对象已经定义好了，所以要做的只是简单地调用Shoe.Clone()而已。这有点类似于C#或者说.NET Framework下提到的&amp;#8220;Deep Copy&amp;#8221;（深拷贝）。&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;&lt;STRONG&gt;&lt;FONT face="Courier New"&gt;（五）&lt;/FONT&gt;&lt;FONT face="Courier New" size=4&gt;Builder&lt;BR&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;个人认为，就GoF书中Maze的例子，适用Builder是最为恰当的。&lt;FONT style="BACKGROUND-COLOR: #ffff00"&gt;Builer的使用更象是搭积木，&lt;/FONT&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff"&gt;要搭的房屋是Client要的对象，其中的每一个积木块是部件对象。&lt;/FONT&gt;Builder Pattern的适用场景可以做如下模拟：&lt;BR&gt;&lt;BR&gt;1. 有一个需要Shoe的Client；&lt;BR&gt;2. Shoe是可以定制的；&lt;BR&gt;3. Shoe可供定制的部件包括鞋底Tread、鞋面Vamp、鞋带Lace（甚至还有更多的可供定制的部分）；&lt;BR&gt;&lt;BR&gt;于是，Builer要做的，就是将部件的构造剥离出来，当部件构造完毕后，再将完整的Shoe交给Client。看看下面这段很简单的代码吧。&lt;BR&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"&gt;
&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;interface&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;Builder&lt;BR&gt;&lt;IMG id=Codehighlighter1_25_114_Open_Image onclick="this.style.display='none'; Codehighlighter1_25_114_Open_Text.style.display='none'; Codehighlighter1_25_114_Closed_Image.style.display='inline'; Codehighlighter1_25_114_Closed_Text.style.display='inline';" src="/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top&gt;&lt;IMG id=Codehighlighter1_25_114_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_25_114_Closed_Text.style.display='none'; Codehighlighter1_25_114_Open_Image.style.display='inline'; Codehighlighter1_25_114_Open_Text.style.display='inline';" src="/Images/OutliningIndicators/ContractedBlock.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_25_114_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"&gt;&lt;IMG src="/Images/dot.gif"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;SPAN id=Codehighlighter1_25_114_Open_Text&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;FONT face="Courier New"&gt;{&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Tread&amp;nbsp;CreateTread();&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vamp&amp;nbsp;CreateVamp();&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Lace&amp;nbsp;CreateLace();&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Shoe&amp;nbsp;GetShoe();&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top&gt;}&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face="Courier New"&gt;&lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;class&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;BuilderMale&amp;nbsp;:&amp;nbsp;Builder&lt;BR&gt;&lt;IMG id=Codehighlighter1_151_445_Open_Image onclick="this.style.display='none'; Codehighlighter1_151_445_Open_Text.style.display='none'; Codehighlighter1_151_445_Closed_Image.style.display='inline'; Codehighlighter1_151_445_Closed_Text.style.display='inline';" src="/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top&gt;&lt;IMG id=Codehighlighter1_151_445_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_151_445_Closed_Text.style.display='none'; Codehighlighter1_151_445_Open_Image.style.display='inline'; Codehighlighter1_151_445_Open_Text.style.display='inline';" src="/Images/OutliningIndicators/ContractedBlock.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_151_445_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"&gt;&lt;IMG src="/Images/dot.gif"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;SPAN id=Codehighlighter1_151_445_Open_Text&gt;&lt;FONT face="Courier New"&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;Tread&amp;nbsp;CreateTread()&lt;BR&gt;&lt;IMG id=Codehighlighter1_182_214_Open_Image onclick="this.style.display='none'; Codehighlighter1_182_214_Open_Text.style.display='none'; Codehighlighter1_182_214_Closed_Image.style.display='inline'; Codehighlighter1_182_214_Closed_Text.style.display='inline';" src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top&gt;&lt;IMG id=Codehighlighter1_182_214_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_182_214_Closed_Text.style.display='none'; Codehighlighter1_182_214_Open_Image.style.display='inline'; Codehighlighter1_182_214_Open_Text.style.display='inline';" src="/Images/OutliningIndicators/ContractedSubBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_182_214_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"&gt;&lt;IMG src="/Images/dot.gif"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;SPAN id=Codehighlighter1_182_214_Open_Text&gt;&lt;FONT face="Courier New"&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;TreadForMale();&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&lt;FONT face="Courier New"&gt;public&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face="Courier New"&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;Vamp&amp;nbsp;CreateVamp()&lt;BR&gt;&lt;IMG id=Codehighlighter1_244_275_Open_Image onclick="this.style.display='none'; Codehighlighter1_244_275_Open_Text.style.display='none'; Codehighlighter1_244_275_Closed_Image.style.display='inline'; Codehighlighter1_244_275_Closed_Text.style.display='inline';" src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top&gt;&lt;IMG id=Codehighlighter1_244_275_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_244_275_Closed_Text.style.display='none'; Codehighlighter1_244_275_Open_Image.style.display='inline'; Codehighlighter1_244_275_Open_Text.style.display='inline';" src="/Images/OutliningIndicators/ContractedSubBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_244_275_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"&gt;&lt;IMG src="/Images/dot.gif"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;SPAN id=Codehighlighter1_244_275_Open_Text&gt;&lt;FONT face="Courier New"&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;VampForMale();&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&lt;FONT face="Courier New"&gt;public&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face="Courier New"&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;Lace&amp;nbsp;CreateLace()&lt;BR&gt;&lt;IMG id=Codehighlighter1_312_347_Open_Image onclick="this.style.display='none'; Codehighlighter1_312_347_Open_Text.style.display='none'; Codehighlighter1_312_347_Closed_Image.style.display='inline'; Codehighlighter1_312_347_Closed_Text.style.display='inline';" src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top&gt;&lt;IMG id=Codehighlighter1_312_347_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_312_347_Closed_Text.style.display='none'; Codehighlighter1_312_347_Open_Image.style.display='inline'; Codehighlighter1_312_347_Open_Text.style.display='inline';" src="/Images/OutliningIndicators/ContractedSubBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_312_347_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"&gt;&lt;IMG src="/Images/dot.gif"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;SPAN id=Codehighlighter1_312_347_Open_Text&gt;&lt;FONT face="Courier New"&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;LaceForMale();&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&lt;FONT face="Courier New"&gt;public&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face="Courier New"&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;Shoe&amp;nbsp;GetShoe()&lt;BR&gt;&lt;IMG id=Codehighlighter1_374_443_Open_Image onclick="this.style.display='none'; Codehighlighter1_374_443_Open_Text.style.display='none'; Codehighlighter1_374_443_Closed_Image.style.display='inline'; Codehighlighter1_374_443_Closed_Text.style.display='inline';" src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top&gt;&lt;IMG id=Codehighlighter1_374_443_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_374_443_Closed_Text.style.display='none'; Codehighlighter1_374_443_Open_Image.style.display='inline'; Codehighlighter1_374_443_Open_Text.style.display='inline';" src="/Images/OutliningIndicators/ContractedSubBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_374_443_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"&gt;&lt;IMG src="/Images/dot.gif"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;SPAN id=Codehighlighter1_374_443_Open_Text&gt;&lt;FONT face="Courier New"&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;Shoe(CreateTread(),&amp;nbsp;CreateVamp(),&amp;nbsp;CreateLace());&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;&lt;IMG src="/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top&gt;}&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face="Courier New"&gt;&lt;SPAN style="COLOR: #008000"&gt;//&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;在Client里&lt;/SPAN&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face="Courier New"&gt;&lt;SPAN style="COLOR: #000000"&gt;Builder&amp;nbsp;builder&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;BuilderMale();&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;Shoe&amp;nbsp;shoe&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;builder.GetShoe();&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;从某个角度说，Builder很象Factory，即一种Shoe对应一种Builder。同时也很象Prototype，它只是把Clone()换作了GetShoe()。&lt;BR&gt;&lt;BR&gt;同样的，在Gof使用Builder构造Maze的示例里，他又将Maze的构造责任交给了Client。换作上述的代码，即CreateTread()、CreateVamp()与CreateBootlace()由Client直接调用。当Client获取了Tread、Vamp、Bootlace对象后，通过调用Shoe的组装函数完成组装，然后调用Builder的GetShoe()获取最后的Shoe对象。不过他的示例里，也演示了如何利用Builder进行对象计数，很是有趣。 &lt;/FONT&gt;&lt;/P&gt;&lt;FONT face="Courier New"&gt;
&lt;HR id=null&gt;
&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#ffff00&gt;&lt;FONT color=#000080&gt;2006-9-7修订&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;BR&gt;最近又在网上找了一些Factory、Builder的例子，发现它们确实都按照GoF的方式，将子部件的构造也交由Client负责，所以开始怀疑自己的理解是否正确。&lt;BR&gt;&lt;BR&gt;在GoF的这种方式里，Factory或者Builder在提供了CreateShoe()接口的同时，也要提供Shoe各部件的CreateVamp()、CreateTread()、CreateLace()接口。Client利用CreateShoe()返回一个没有实质意义的Shoe对象，然后再利用CreateVamp()等获取各部件，最后利用Shoe对象的方法完成组装。 
&lt;HR id=null&gt;
2007-2-14修订&lt;BR&gt;&lt;BR&gt;因为对上述组装过程究竟应由Client还是Builder负责存在疑惑，我又去找了一些例子和文章。肯定的答案是：Product的组装过程由Client决定，这个组装过程是应用中恒定的内容。变化的是不同种类的Product由不同种类的Builder提供相应的部件。&lt;BR&gt;
&lt;HR id=null&gt;
&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;2007-3-20修订&lt;BR&gt;&lt;BR&gt;在MSDN Web Cast 李建忠的系列讲座《C#面向对象设计模式纵横谈》中，给出了Singleton更为简洁的实现方式，很不错：&lt;BR&gt;&lt;BR&gt;
&lt;DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"&gt;
&lt;DIV&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;SPAN style="COLOR: #0000ff"&gt;class&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;Singleton&lt;BR&gt;&lt;IMG id=Codehighlighter1_16_102_Open_Image onclick="this.style.display='none'; Codehighlighter1_16_102_Open_Text.style.display='none'; Codehighlighter1_16_102_Closed_Image.style.display='inline'; Codehighlighter1_16_102_Closed_Text.style.display='inline';" src="/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top&gt;&lt;IMG id=Codehighlighter1_16_102_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_16_102_Closed_Text.style.display='none'; Codehighlighter1_16_102_Open_Image.style.display='inline'; Codehighlighter1_16_102_Open_Text.style.display='inline';" src="/Images/OutliningIndicators/ContractedBlock.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_16_102_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"&gt;&lt;IMG src="/Images/dot.gif"&gt;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_16_102_Open_Text&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;static&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;readonly&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;Instance&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;Singleton();&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&lt;BR&gt;&lt;IMG id=Codehighlighter1_98_100_Open_Image onclick="this.style.display='none'; Codehighlighter1_98_100_Open_Text.style.display='none'; Codehighlighter1_98_100_Closed_Image.style.display='inline'; Codehighlighter1_98_100_Closed_Text.style.display='inline';" src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top&gt;&lt;IMG id=Codehighlighter1_98_100_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_98_100_Closed_Text.style.display='none'; Codehighlighter1_98_100_Open_Image.style.display='inline'; Codehighlighter1_98_100_Open_Text.style.display='inline';" src="/Images/OutliningIndicators/ContractedSubBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;Singleton()&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_98_100_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"&gt;&lt;IMG src="/Images/dot.gif"&gt;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_98_100_Open_Text&gt;&lt;SPAN style="COLOR: #000000"&gt;{;}&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top&gt;}&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;BR&gt;
&lt;HR id=null&gt;
&lt;/FONT&gt;&lt;img src ="http://blog.vckbase.com/abbey/aggbug/22156.html" width = "1" height = "1" /&gt;</description></item></channel></rss>