类关系图
类角色说明
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、 模式所建造的最终产品更易于控制。


浙公网安备 33010602011771号