代码改变世界

设计模式之建造者模式(Builder)

2010-01-19 20:27  key_sky  阅读(203)  评论(0编辑  收藏  举报

建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时使用的模式。

Builder:为创建一个Product对象的各个部件指定的抽象接口
ConcreteBuilder:具体建造者,实现Builder接口,构造和装配各个部件
Product:具体的产品角色
Director:指挥者,构建一个使用Bulider接口的对象

使用条件:
1.需要生成的产品具有复杂的内部结构
2.需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
3.在对象创建过程中使用到系统中的一些其他对象,这些对象在产品的创建过程中不易得到。

Builder1.cs

代码
using System;
using System.Collections.Generic;
using System.Text;

//建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以
//创建不同的表示。在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配
//方式时使用的模式

//Builder:为创建一个Product对象的各个部件指定的抽象接口
//ConcreteBuilder:具体建造者,实现Builder接口,构造和装配各个部件
//Product:具体的产品角色
//Director:指挥者,构建一个使用Bulider接口的对象

//使用条件:
//1.需要生成的产品具有复杂的内部结构
//2.需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
//3.在对象创建过程中使用到系统中的一些其他对象,这些对象在产品的创建过程中不易得到。
namespace Builder
{
class Builder1
{
}

//Prodcut类
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类
abstract class Builder
{
public abstract void BuildPartA();
public abstract void BuildPartB();
public abstract Product GetResult();
}

//具体建造者类
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;
}
}

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;
}
}

//指挥者类
class Director
{
public void Construct(Builder builder)
{
builder.BuildPartA();
builder.BuildPartB();
}
}
}

Program.cs

代码
using System;
using System.Collections.Generic;
using System.Text;

namespace Builder
{
class Program
{
static void Main(string[] args)
{
Director director
= new Director();
Builder b1
= new ConcreteBuilder1();
Builder b2
= new ConcreteBuilder2();

director.Construct(b1);
Product p1
= b1.GetResult();
p1.Show();

director.Construct(b2);
Product p2
= b2.GetResult();
p2.Show();

Console.Read();
}
}
}

运行结果:

产品 创建 ----

部件A

部件B

产品 创建 ----

部件X

部件Y