博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

设计模式——建造者模式(Builder Pattern)

Posted on 2008-08-21 15:12  Anna Yang  阅读(239)  评论(0编辑  收藏  举报
设计模式(4):  建造者模式(Builder Pattern)
 
 
建造者模式(Builder Pattern)
 
概述 
 
     建造者模式是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法确相对稳定。如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变?这就是要说的建造者模式。
 
                   建造者模式(Builder)结构图

 
Product类——产品类,由多个部件组成
: 
class Product
{
    IList
<string> parts=new List<string>();
    
public void Add(string part)
    {
        parts.Add(part);
    }
    
public void show()
    {
        Console.WriteLine(
"\n产品 创建-----");
        
foreach(string part in parts)
        {
            Console.WriteLine(part);
        }
    }
}
 
Builder类——抽象建造者类,确定产品由两个部件PartA和PartB组成,并声明一个得到产品建造后结果的方法GetResult.
这样在具体的建造者类中不会遗忘建造某个部件。
 
abstract class Builder
{
    
public abstract void BuildPartA();
    
public abstract void BuildPartB();
    
public abstract Product GetResult();
}
 
ConcreteBuilder类——具体建造者类。 
class ConcreteBuilder1:Builder
{
    
private Product product=new Product();
    
public override void BuildPartA()
    {
        product.Add(
"部件A");
    }
    
public override void BuildPartB()
    {
        product.Add(
"部件B");
    }
    
public override Product GetResult()
    {
        
return product;
    }
 
ConcreteBuilder——具体建造者类 
class ConcreteBuilder2:Builder
{
    
private Product product=new Product();
    
public override void BuildPartA()
    {
        product.Add(
"部件X");
    }
    
public override void BuildPartB()
    {
        product.Add(
"部件Y");
    }
    
public override Product GetResult()
    {
        
return product;
 
Director类,有了此类,就避免了在客户端时调用具体建造者类的建造方法。 
class Director
{
    
public void Construct(Builder builder)
    {
        builder.BuilderPartA();
        builder.BuilderPartB();
    }
}
 
客户端代码,客户不需要知道具体的建造过程 
static void Main(string[] args)
{
    Director director
=new Director();
    Builder b1
=new ConcreteBuilder1();
    Builder b1
=new ConcreteBuilder2();

    director.Construct(b1);
    Product p1
=b1.GetReturn();
    p1.show();
    
    director.Construct(b2);
    Product p2
=b2.GetReturn();
    p2.show();
}
 
运用反射:
class Datatable
{
    
private static readonly string AssemblyName="建造者模式"
    
private static readonly string cb="ConcreteBuilder1";
    
//private static readonly string cb="ConcreteBuilder2";
    public static Builder Create()
    {
        
string className=AssemblyName+"."+cb;
        
return (Builder)Assembly.Load(AssemblyName).CreateInstance(className);
    }
}
 
反射的客户端代码: 
static void Main(string[] args)
{
    Builder b
=Datatable.Create();
    Director director
=new Director();
    Director.Construct(b);
    Product p
=b.GetResult();
    p.show();
}