以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 Dot NET,C#,ASP,VB 』  (http://bbs.xml.org.cn/list.asp?boardid=43)
----  设计模式之C#实现(二)---Builder  (http://bbs.xml.org.cn/dispbbs.asp?boardid=43&rootid=&id=11878)


--  作者:admin
--  发布时间:11/9/2004 2:26:00 AM

--  设计模式之C#实现(二)---Builder


发信人: wrighten (wrighten), 信区: DotNET
标  题: 设计模式之C#实现(二)---Builder
发信站: BBS 水木清华站 (Sat Mar  6 20:02:04 2004)

设计模式之C#实现---Builder  
    
  上次我们学习了创建型模式中的AbstractFactory,这次我们将要介绍一个和它比较像的
创建型模式Builder(至于关于Builder的详细内容您可以参考GOF的书,在这里不重复了。
)。在GOF的书里Builder的目的是这样的:Separate the construction of a complex o
bject from its representation so that the same construction process can create
different representations.在我的程序设计中很难免会使用复杂的对象比如:车的组成
、电脑的组成以及人在内。那么我们在创建电脑这个对象的时候我想我们需要一步一步的
创建组成电脑的每一部分,先创建CPU对象、Memory对象、HardDisk对象等等。Builder就
是这样一种模式用来一步一步的创建对象的每一部分。回忆一下AbstractFactory也是创建
一族相关的对象,Builder也是创建一些相关的对象,两者之间的区别很微妙需要在以后的
实践中细细体会。  
    
  既然文章叫设计模式之C#实现那么肯定少不了代码了,这次我想说的更清楚一些,我打
算从如下两个方面来实现,首先我想要直接实现他的结构,也就是我们在下面的图中看到
的那些类。接着我将用以个具体的例子或者书上的例子描述一下用来加深理解,希望我的
描述可以帮助你更好的学习。
从图上我们可以看出我们的Builder接口中有两个BuilderPart方法A、B,以及一个GetRes
ult方法用来返回创建的对象。将我们用ConcreteBuilder1和ConcreteBuilder1实现接口的
时候我们分别在其中加入了一个Private的对象,用来返回建立好的对象,在该实例的内部
则是经过了两步才完成了Product对象的初始化。我们建立的Product是由一个Hashtable组
成,可以添加和显示自己的每一个部分(就是Hashtable里面的每一个键/值)。好了不废
话了看看下面的实现代码,在WinForm中调试通过,你可以参看本系列的AbstractFactory
文章找到里面的相关表现对象(RichTextBox)。  
    
   代码中有少量的注释是为了更好的理解。  
    
  using System;  
    
    
    
  namespace Builder_Me{  
    
    
    
   using System.Collections;  
    
    
    
   // specifies an abstract interface for creating parts of a Product object.  

    
   //为创建对象的一个部分指定一个接口  
    
   public interface Builder{  
    
   void BuildPartA();  
    
   void BuildPartB();  
    
   Product GetResult();  
    
   }  
    
    
    
   // constructs and assembles parts of the product by impementing the Builder
interface.  
    
   // defines and keeps track of the representation it creates.  
    
   // provides an interface for retrieving the product.  
    
   public class ConcreteBuilder1 : Builder{  
    
   private Product m_Product;  
    
   public void BuildPartA(){  
    
   this.m_Product = new Product();  
    
   this.m_Product.AddParts("1","PartA");  
    
   }  
    
   public void BuildPartB(){  
    
   this.m_Product.AddParts("2","PartB");  
    
   }  
    
    
    
   public Product GetResult(){  
    
   return this.m_Product;  
    
   }  
    
   }  
    
    
    
   public class ConcreteBuilder2 : Builder{  
    
   private Product m_Product;  
    
    
    
   public void BuildPartA(){  
    
   //必须先调用该方法否则不能实例化对象  
    
   this.m_Product = new Product();  
    
   this.m_Product.AddParts("3","Part1");  
    
   }  
    
    
    
   public void BuildPartB(){  
    
   this.m_Product.AddParts("4","Part2");  
    
   }  
    
    
    
   public Product GetResult(){  
    
   return this.m_Product;  
    
   }  
    
   }  
    
    
    
   // construct an object using the Builder interface.  
    
   public class Director{  
    
   public void Construct(Builder builder){  
    
   //顺序不能变  
    
   builder.BuildPartA();  
    
   builder.BuildPartB();  
    
   }  
    
   }  
    
    
    
   // represents the complex object under construction.ConcreteBuilder builds  

    
   // the product's internal representation and defines the process by which i
t's  
    
   // assembled.  
    
   // includes classes that define the constituent parts,including interfaces  
for  
    
   // assembling the parts into the final result.  
    
   //要创建复杂的对象该对象我们用Hashtable组合表示。  
    
   public class Product{  
    
   Hashtable m_Parts = new Hashtable();  
    
    
    
   public void AddParts(string partKey,string partValue){  
    
   this.m_Parts.Add(partKey,partValue);  
    
   }  
    
    
    
   public string ShowSelfParts(){  
    
   string strResult = string.Empty;  
    
   int i = 1;  
    
   foreach(string strTmp in this.m_Parts.Values){  
    
   strResult +="Part"+i.ToString()+":\t"+strTmp+"\n";  
    
   i++;  
    
   }  
    
   return strResult;  
    
   }  
    
   }  
    
  }  
    
    
    
  客户端的代码片断如下:  
    
  Director director = new Director();  
    
   Builder builder1 = new ConcreteBuilder1();  
    
   Builder builder2 = new ConcreteBuilder2();  
    
   director.Construct( builder1 );  
    
   Product p1 = builder1.GetResult();  
    
   this.richTextBox1.AppendText(p1.ShowSelfParts());  
    
    
    
   director.Construct( builder2 );  
    
   Product p2 = builder2.GetResult();  
    
   this.richTextBox1.AppendText(p2.ShowSelfParts());  
    
  由于GOF的例子是C++实现所以转换成C#也非常容易,我在这里就不转换了,有兴趣的人
可以转换跟帖。  
    
  本人能力有限,如果在上面有什么说错的或者不准确地方请网友指正,我将虚心学习,
我的email:wu_jian830@hotmail.com

--
情人节一个人过。。。。。。
cplusplus forever


※ 来源:·BBS 水木清华站 http://smth.org·[FROM:202.113.19.*]
上一篇
返回上一页
回到目录
回到页首



W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
62.500ms