类关系图


类角色说明
1、抽象建造者角色Builder:
给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于应用程序的商业逻辑。模式中直接创建产品对象的是具体建造者(ConcreteBuilder)角色。具体建造者类必须实现这个接口所要求的方法:一个是建造方法,另一个是结果返还方法。
2、具体建造者角色Concrete Builder:
这个角色类继承于Builder角色,并实现Builder类,通常为多个不同兄弟类,建造不同的产品实例
担任这个角色的是于应用程序紧密相关的类,它们在应用程序调用下创建产品实例。这个角色主要完成的任务包括:
· 实现Builder角色提供的接口,一步一步完成创建产品实例的过程。
· 在建造过程完成后,提供产品的实例。
3、指导者(Director)角色:
这个角色相当于一个菜单,客户端通过调用这个角色类来得到不同的产品。其中一般为调用抽象建造角色Builder的建造接口来建造不同的产品。
担任这个角色的类调用具体建造者角色以创建产品对象。导演者并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者对象。
4、产品(Product)角色:产品便是建造中的复杂对象。
指导者角色是于客户端打交道的角色。导演者角色将客户端创建产品的请求划分为对各个零件的建造请求,再将这些请求委派给具体建造者角色。具体建造者角色是做具体建造工作的,但却不为客户端所知。
建造者模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。

意图
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

适用性
1、一个系统要独立于它的产品的创建、组合和表示时。 
2、一个系统要由多个产品系列中的一个来配置时。 
3、当你要强调一系列相关的产品对象的设计以便进行联合使用时。
4、当你提供一个产品类库,而只想显示它们的接口而不是实现时。

泡妞的例子
BUILDER—和MM在一起,有时候要一起玩一些开心的游戏,这样让她觉得和你在一起是一件很开心的事情,这样才能获得她的芳心。这次,我们要玩的是画脸谱的游戏,一张白纸在脸上要画脸型,眼睛,鼻子,耳朵,嘴巴。哈哈,虽然被画得丑八怪一样,但是MM笑得花枝乱颤,也值了啊。

泡妞的代码

using System;
using System.Collections;

 
// "Product"
 public class Mask
  
{
   
// Fields
   private Hashtable parts;

   
public Mask()
{
    parts
=new Hashtable();
}

   
// Indexers
   public object this[ string key ]
    
{
      
get{ return parts[ key ]; }
      
set{ parts[ key ] = value; }
   }

// Methods
   public void Show()
    
{
     Console.WriteLine( 
" ---------------------------");
     Console.WriteLine( 
" 脸型 : " + parts[ "face" ] );
     Console.WriteLine( 
" 眼睛 : "+ parts[ "eye"] );
     Console.WriteLine( 
" 鼻子: "+ parts[ "nose"] );
     Console.WriteLine( 
" 嘴巴 : "+ parts[ "mouth" ] );
     Console.WriteLine( 
" 耳朵 : "+ parts[ "ear" ] );
   }

 }


 
// "Builder"
 public abstract class MaskPainter
  
{
   
// Fields
   protected Mask mask;
 
   
// Properties
   public Mask Mask
    
{
      
get{ return mask; }
   }

   
// Methods
   abstract public void PaintFace();
   
abstract public void PaintEye();
   
abstract public void PaintEar();
   
abstract public void PaintMouth();
   
abstract public void PaintNose();
 }

 
 
// "ConcreteBuilder"
 public class GirlFriend : MaskPainter
  
{
   
public GirlFriend()
   
{
     mask
=new Mask();
   }

   
// Methods
   override public void PaintFace()
   
{
     mask[ 
"face" ] = "画个猪腰子脸!";
   }

   
override public void PaintEye()
   
{
     mask[ 
"eye" ] = "画个独眼!";
   }

   
override public void PaintEar()
   
{
     mask[ 
"ear" ] = "画对耳朵不一般大!";
   }

   
override public void PaintMouth()
   
{
     mask[ 
"mouth" ] = "男儿嘴大吃四方!";
   }

   
override public void PaintNose()
   
{
     mask[ 
"nose" ] = "画个猪鼻子好彩头!";
   }

 }


// "Director"
 public class Director
  
{
   
// Methods
   public void Construct( MaskPainter painter )
    
{
     painter.PaintFace();
     painter.PaintEye();
     painter.PaintEar();
     painter.PaintNose();
     painter.PaintMouth();
   }

 }

 
  
/// <summary>
 
/// BuilderApp test
 
/// </summary>

 public class BuilderApp
  
{
   
public static void Main( string[] args )
    
{
     Director director 
= new Director();
     
     MaskPainter Lily
=new GirlFriend();
     
// Construct and display
     director.Construct(Lily );
     Lily.Mask.Show();
   }

 }

建造者模式
建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。

优缺点
1、 建造模式的使用使得产品的内部表象可以独立的变化。使用建造者模式可以使客户端不必知道产品内部组成的细节。
2、 每一个Builder都相对独立,而与其它的Builder无关。
3、 模式所建造的最终产品更易于控制。

posted on 2007-02-20 18:18  十分之七  阅读(628)  评论(2)    收藏  举报