建造者模式(Builder)将复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
在软件系统中,有时候面临一个复杂对象的创建工作,该对象通常由各个部分子对象用一定的算法构成,或者按一定的步骤组合而成;这些算法和步骤是稳定的,而构成这个对象的子对象却经常由于需求的变化而不断变化。
在建造者模式中,Director规定了创建一个对象所需要的步骤和次序,Builder则提供了一些完成这些步骤的方法,ConcreteBuilder给出了这些方法的具体实现,是对象的直接创建者。
结构图
建造者模式适用情形:
◊ 需要生成的产品对象有复杂的内部结构
◊ 需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序
◊ 在对象创建过程中会使用到系统中的一些其他对象,这些对象在产品对象的创建过程中不易得到。
建造者模式特点:
◊ 建造者模式的使用使得产品的内部表对象可以独立地变化。使用建造者模式可以使客户不必知道产品内部组成的细节。
◊ 每一个Builder都相对独立,而与其他Builder无关
◊ 可使对构造过程更加精细控制
◊ 将构建代码和表示代码分开
◊ 建造者模式的缺点在于难于应付分步骤构建算法的需求变动
namespace Libraries.Test.DesignPattern.Builder
{
/// <summary>
/// 套餐
/// </summary>
public class Package
{
public string Foot { get; set; }
public string Drinks { get; set; }
}
}
namespace Libraries.Test.DesignPattern.Builder
{
public interface IBuilder
{
void BuildFood(string name);
void BuildDrinks(string name);
Package GetResult();
}
}
namespace Libraries.Test.DesignPattern.Builder
{
/// <summary>
/// 构建鸡翅套餐
/// </summary>
public class BuilderChickenWings : IBuilder
{
private Package package = new Package();
public void BuildDrinks(string name)
{
package.Drinks = name;
}
public void BuildFood(string name)
{
package.Foot = name;
}
public Package GetResult()
{
return package;
}
}
}
namespace Libraries.Test.DesignPattern.Builder
{
/// <summary>
/// 构建鸡腿套餐
/// </summary>
public class BuilderDrumsticks : IBuilder
{
private Package package = new Package();
public void BuildDrinks(string name)
{
package.Drinks = name;
}
public void BuildFood(string name)
{
package.Foot = name;
}
public Package GetResult()
{
return package;
}
}
}
namespace Libraries.Test.DesignPattern.Builder
{
public class Director
{
private IBuilder iBuilder;
public Director(IBuilder builder)
{
iBuilder = builder;
}
/// <summary>
/// 规定步骤
/// </summary>
public Package Construct(string foot, string drinks)
{
iBuilder.BuildFood(foot);
iBuilder.BuildDrinks(drinks);
return iBuilder.GetResult();
}
}
}
namespace Libraries.Test.DesignPattern.Builder
{
public class Client
{
public void Excute()
{
IBuilder iBuilder = new BuilderDrumsticks();
Director director = new Director(iBuilder);
Package drumsticksPackage = director.Construct("鸡腿", "可乐");
iBuilder = new BuilderChickenWings();
director = new Director(iBuilder);
Package chickenWingsPackage = director.Construct("鸡翅", "雪碧");
}
}
}
与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。