/// <summary>
/// 目的:学习建造者模型
/// 日期:2013年11月20日
/// 作者:秦元培
/// 摘要:
/// 下面描述的是建造者模式,建造者模式共有四种角色,分别是:
/// 建造者角色、具体建造者角色、指导者角色、产品角色
/// 建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于应用程序的商业逻辑。模式中直接创建产品对象的是具体建造者(ConcreteBuilder)角色。具体建造者类必须实现这个接口所要求的方法:一个是建造方法,另一个是结果返还方法。
/// 具体建造者(Concrete Builder)角色:担任这个角色的是于应用程序紧密相关的类,它们在应用程序调用下创建产品实例。这个角色主要完成的任务包括:实现Builder角色提供的接口,一步一步完成创建产品实例的过程。在建造过程完成后,提供产品的实例。
/// 指导者(Director)角色:担任这个角色的类调用具体建造者角色以创建产品对象。导演者并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者对象。
/// 产品(Product)角色:产品便是建造中的复杂对象。
/// 指导者角色是于客户端打交道的角色。导演者角色将客户端创建产品的请求划分为对各个零件的建造请求,再将这些请求委派给具体建造者角色。具体建造者角色是做具体建造工作的,但却不为客户端所知。
/// A、以下情况应当使用建造者模式:
/// 1、 需要生成的产品对象有复杂的内部结构。
/// 2、 需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
/// 3、 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。
/// B、使用建造者模式主要有以下效果:
/// 1、 建造模式的使用使得产品的内部表象可以独立的变化。使用建造者模式可以使客户端不必知道产品内部组成的细节。
/// 2、 每一个Builder都相对独立,而与其它的Builder无关。
/// 3、 模式所建造的最终产品更易于控制。
/// C、建造者模式的变种
/// 1、如果系统中只有一个具体建造者,则可以省略抽象建造者;
/// 2、在具体建造者只有一个的情况下,如果抽象建造者角色已经被省略掉,那么还可以省略掉指导者角色。让Builder角色自己扮演指导者与建造者双重角色。
/// </summary>
class BuilderPattern
{
/// <summary>
/// 建造者角色类
/// </summary>
abstract class Builder
{
abstract public void BuildPartA();
abstract public void BuildPartB();
abstract public Product GetProduct();
}
/// <summary>
/// 指导者角色
/// </summary>
class Director
{
public void Construct(Builder builder)
{
builder.BuildPartA();
builder.BuildPartB();
}
}
/// <summary>
/// 具体建造者
/// </summary>
class ConcreteBuilder1:Builder
{
//私有字段product用于在内部完成产品的组装
private Product product;
public override void BuildPartA()
{
product = new Product();
product.Add("PartA");
}
public override void BuildPartB()
{
product.Add("PartB");
}
public override Product GetProduct()
{
return product;
}
}
/// <summary>
/// 具体建造者
/// </summary>
class ConcreteBuilder2:Builder
{
//私有字段product用于在内部完成产品的组装
private Product product;
public override void BuildPartA()
{
product = new Product();
product.Add("PartX");
}
public override void BuildPartB()
{
product.Add("PartY");
}
public override Product GetProduct()
{
return product;
}
}
/// <summary>
/// 产品角色类
/// </summary>
class Product
{
ArrayList List = new ArrayList();
/// <summary>
/// 产品类的Add方法,用以处理要组装的各个部分
/// </summary>
/// <param name="part">待组装的部分</param>
public void Add(string part)
{
List.Add(part);
}
/// <summary>
/// 显示产品具体信息的方法
/// </summary>
public void Show()
{
Console.WriteLine("下面显示该产品的各个部分信息");
foreach (string part in List)
{
Console.WriteLine("这是该产品的" + part + "部分");
}
}
}
/// <summary>
/// 客户端类
/// </summary>
class Client
{
public void Main()
{
///指导者
Director director = new Director();
//建造者
Builder b1 = new ConcreteBuilder1();
Builder b2 = new ConcreteBuilder2();
//开始组装,b1将PartA与PartB组装成一个Product
director.Construct(b1);
//使用GetProduct方法返回创建好的产品
Product product1 = b1.GetProduct();
//显示产品信息
product1.Show();
//开始组装,b2将PartX与PartY组装成一个Product
director.Construct(b2);
//使用GetProduct方法返回创建好的产品
Product product2 = b1.GetProduct();
//显示产品信息
product2.Show();
}
}
}
设计模式之建造者模式
最新推荐文章于 2025-02-20 19:36:02 发布