您的位置:首页 > 编程语言 > C#

C#设计模式(三)建造着模式

2015-01-29 12:43 211 查看
class Test
{
static void Main()
{

Director director = new Director();
Builder b1 = new ConcreteBuilder1();
Builder b2 = new ConcreteBuilder2();

director.Construct(b1);

Computer computer1 = b1.GetComputer();
computer1.Show();

director.Construct(b2);
Computer computer2 = b2.GetComputer();
computer2.Show();
//test2 t2 = new test2();
//t2.additem();//test2给class test1赋值
//test1 t1 = t2.getitem();//test1得到test2的赋值
//t1.show();
//Console.ReadKey();
}

//public class test1
//{
//   List<string> l1 = new List<string>();

//    public void add(string item)
//    {
//        l1.Add(item);
//    }
//    public void show()
//    {
//        foreach (var item in l1)
//        {
//            Console.WriteLine(item.ToString());
//        }
//    }
//}

//public class test2
//{
//    test1 t1 = new test1();
//    public void additem()
//    {
//        t1.add("111");
//    }
//    public test1 getitem()
//    {
//        return t1;
//    }
//}

public class Director
{
// 组装电脑
public void Construct(Builder builder)
{
builder.BuildPartCPU();
builder.BuildPartMainBoard();
}
}

/// <summary>
/// 电脑类
/// </summary>
public class Computer
{

// 电脑组件集合
private IList<string> parts = new List<string>();

// 把单个组件添加到电脑组件集合中
public void Add(string part)
{
parts.Add(part);
}

public void Show()
{
Console.WriteLine("Begin.......");
foreach (string part in parts)
{
Console.WriteLine("Compont" + part + "is ready");
}

Console.WriteLine("finish");
}
}

/// <summary>
/// 抽象建造者,这个场景下为 "组装人" ,这里也可以定义为接口
/// </summary>
public abstract class Builder
{
// 装CPU
public abstract void BuildPartCPU();
// 装主板
public abstract void BuildPartMainBoard();

// 当然还有装硬盘,电源等组件,这里省略

// 获得组装好的电脑
public abstract Computer GetComputer();
}

/// <summary>
/// 具体创建者,具体的某个人为具体创建者,例如:装机小王啊
/// </summary>
public class ConcreteBuilder1 : Builder
{
Computer computer = new Computer();
public override void BuildPartCPU()
{
computer.Add("CPU1");
}

public override void BuildPartMainBoard()
{
computer.Add("Main board1");
}

public override Computer GetComputer()
{
return computer;
}
}

/// <summary>
/// 具体创建者,具体的某个人为具体创建者,例如:装机小李啊
/// 又装另一台电脑了
/// </summary>
public class ConcreteBuilder2 : Builder
{
Computer computer = new Computer();
public override void BuildPartCPU()
{
computer.Add("CPU2");
}

public override void BuildPartMainBoard()
{
computer.Add("Main board2");
}

public override Computer GetComputer()
{
return computer;
}
}
}

在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成。例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象,它是由CPU、主板、硬盘、显卡、机箱等组装而成的,如果此时让采购员一台一台电脑去组装的话真是要累死采购员了,这里就可以采用建造者模式来解决这个问题,我们可以把电脑的各个组件的组装过程封装到一个建造者类对象里,建造者只要负责返还给客户端全部组件都建造完毕的产品对象就可以了。

介绍完了建造者模式的具体实现之后,让我们总结下建造模式的实现要点:
在建造者模式中,指挥者是直接与客户端打交道的,指挥者将客户端创建产品的请求划分为对各个部件的建造请求,再将这些请求委派到具体建造者角色,具体建造者角色是完成具体产品的构建工作的,却不为客户所知道。
建造者模式主要用于“分步骤来构建一个复杂的对象”,其中“分步骤”是一个固定的组合过程,而复杂对象的各个部分是经常变化的(也就是说电脑的内部组件是经常变化的,这里指的的变化如硬盘的大小变了,CPU由单核变双核等)。
产品不需要抽象类,由于建造模式的创建出来的最终产品可能差异很大,所以不大可能提炼出一个抽象产品类。
在前面文章中介绍的抽象工厂模式解决了“系列产品”的需求变化,而建造者模式解决的是 “产品部分” 的需要变化。
由于建造者隐藏了具体产品的组装过程,所以要改变一个产品的内部表示,只需要再实现一个具体的建造者就可以了,从而能很好地应对产品组成组件的需求变化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: