设计模式学习笔记-建造者模式
概述:
建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
使用场合:
1.当创建复杂对象的算法应该独立于该对象的组成部分及他们的装配方式时。
2.当构造过程必须允许被构造的对象有不同的表示时。
类图:
代码结构实例:
1.具体的产品类,即我们要制造的产品
/// <summary>
/// 具体的产品类,由多个部件组成
/// </summary>
class Product
{
IList<string> parts = new List<string>();
/// <summary>
/// 添加产品部件
/// </summary>
public void Add(string part)
{
parts.Add(part);
}
public void Show()
{
Console.WriteLine("\n 产品 创建----");
foreach(string part in parts)
{
Console.WriteLine(part);
}
}
}
2.建造产品的抽象类,定义了怎么建造这个产品的方法和产生出来的结果,但是不负责具体建造
/// <summary>
/// 抽象建造者类,确定产品由PartA和PartB组成,并声明一个得到产品建造结果的方法GetResult()
/// </summary>
abstract class Builder
{
public abstract void BuilderPartA();
public abstract void BuilderPartB();
public abstract Product GetResult();
}
3.具体建造类,实现抽象类的所有方法,按照抽象的设计来完成产品的建造和出厂过程,但是可以可以根据不同的客户需求
选用不同的配件,实现产品制造这个过程。下面是两条不同的产品制造过程,制造出同一类产品。
/// <summary>
/// 具体建造者类
/// </summary>
class ConcreteBuilder1:Builder
{
private Product product = new Product();
public override void BuilderPartA()
{
product.Add("部件A");
}
public override void BuilderPartB()
{
product.Add("部件B");
}
public override Product GetResult()
{
return product;
}
}
/// <summary>
/// 具体建造者类
/// </summary>
class ConcreteBuilder2:Builder
{
private Product product = new Product();
public override void BuilderPartA()
{
product.Add("部件X");
}
public override void BuilderPartB()
{
product.Add("部件Y");
}
public override Product GetResult()
{
return product;
}
}
4.有了产品规格,制造流程图,制造车间,还缺一个负责调度的家伙,他来操作制造的机器,但是结果是具体的机器吐出来的产品,所以这个家伙只管闭着眼睛造就行了。
/// <summary>
/// 指挥者类
/// </summary>
class Director
{
public void Construct(Builder builder)
{
builder.BuilderPartA();
builder.BuilderPartB();
}
}
5.客户端调用,开始造吧
/// <summary>
/// 测试建造者模式
/// </summary>
static void TestBuilder()
{
//指挥者到现场来了
Director director = new Director();
//机器1开启,热身
Builder b1 = new ConcreteBuilder1();
//机器2开启,热身
Builder b2 = new ConcreteBuilder2();
//指挥者用 ConcreteBuilder1来创建产品
director.Construct(b1);
//产品就这样从ConcreteBuilder1的pp里出来了
Product p1 = b1.GetResult();
//放到桌面上就能看见了
p1.Show();
//指挥者用 ConcreteBuilder2来创建产品
director.Construct(b2);
//产品就这样从ConcreteBuilder2的pp里出来了
Product p2 = b2.GetResult();
//放到桌面上就能看见了
p2.Show();
Console.Read();
}
小结:
如果你在构造一个复杂的东西(对象)的时候,最好把调度者,建造蓝图,产品规格,建造机器都分开来,这像一个制造流程,但是如果你只需要制作一个手工艺品例如折纸,那就算了。