关键:导向器指导生成器一步步生成复杂产品。然后,导向器获取最终产品。
意图:将产品的构建和具体部件分离。导向器负责产品的构建(组装)过程;生成器负责生成具体的不同部件。
目的:同样的构建步骤,可获取不同的产品
抽象工厂和生成器的异同:
-
相同点:创建复杂的对象。
-
不同点:
- 抽象工厂:在具体工厂中创建一系列对象,并返回每个对象(相当于获取多个对象)。
- 生成器:在导向器中使用生成器按同样的步骤,创建复杂对象(不同对象组装成一个复杂对象)。最终只获取一个对象。类似于流水线组装一个产品。
包括:导向器、抽象生成器、具体生成器
例子:
生成器A按照流水线生成书籍A,生成器B按照流水线生成书籍B。
导向器:类似于流水线
抽象生成器:定义可生成的产品类型和默认产品
具体生成器:生成器A、生成器B,可生成不同的书籍
UML类图
相关接口和类定义:
namespace Builder
{
/// <summary>
/// 导向器(类似于流水线)
/// </summary>
class Director
{
/// <summary>
/// 导向器按步骤生成最终产品。同样的构建步骤,可获取不同的产品。
/// </summary>
/// <param name="builder"></param>
public string BuildBook(Builder builder)
{
builder.BuildWord();
builder.BuildImage();
return builder.GetBook();
}
}
/// <summary>
/// 生成器父类(也可为接口)。使用父类,则子类只需要重写自己感兴趣的方法。
/// </summary>
abstract class Builder
{
protected string Book;
//生成默认单词
public virtual void BuildWord()
{
Book += "默认单词,";
}
//生成默认图像
public virtual void BuildImage()
{
Book += "默认图像";
}
//返回最终产品
public string GetBook()
{
return Book;
}
}
/// <summary>
/// 生成器A,生成书籍A
/// </summary>
class BuilderA : Builder
{
public override void BuildWord()
{
Book += "单词A,";
}
public override void BuildImage()
{
Book += "图像A";
}
}
/// <summary>
/// 生成器B,生成书籍B
/// </summary>
class BuilderB : Builder
{
public override void BuildWord()
{
Book += "单词B,";
}
public override void BuildImage()
{
Book += "图像B";
}
}
}
调用:
using System;
namespace Builder
{
class Program
{
static void Main(string[] args)
{
Director director = new Director();
Builder builder;
//用A生成器生成书籍A
builder = new BuilderA();
string bookA = director.BuildBook(builder);
Console.WriteLine("生成器A按照流水线生成书籍A:包含" + bookA);
//用B生成器生成书籍B
builder = new BuilderB();
string textB = director.BuildBook(builder);
Console.WriteLine("生成器B按照流水线生成书籍B:包含" + textB);
}
}
}
结果:
参考资料:《设计模式-可复用面对对象软件的基础》