建造者模式就是将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示。
适用范围:
- 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
- 当构造过程必须允许被构造的对象有不同表示时。
建造者模式里面有四个角色:
- Builder: 给出一个抽象接口,以规范产品对象的各个组成部分的建造。一般而言,此接口独立于应用程序的业务逻辑。模式中直接创建产品对象的具体创建者角色。具体创建者角色必须实现这个接口的所有方法:一个是建造方法,另一个是结果返还方法。
- ConcreteBuilder:担任这个角色的是与应用程序紧密相关的类,它们在应用程序调用下创建产品实例。这个角色主要完成的任务包括:实现Builder角色提供的接口,一步一步完成创建产品实例的过程。在建造过程完成后,提供产品的实例。
- Director:担任这个角色的类调用具体建造者以创建产品对象。指导者角色并没没用产品类的具体知识,真正拥有产品类的具体知识的是具体建造者对象。
- Product: 表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
具体实现代码如下:
public class Client
{
public void Test()
{
Director d = new Director();
IBuilder b1 = new ConcreteBuilder1();
IBuilder b2 = new ConcreteBuilder2();
d.Construct(b1);
Product p1 = b1.GetResult();
p1.ShowResult();
d.Construct(b2);
Product p2 = b2.GetResult();
p2.ShowResult();
}
}
public class Director
{
public void Construct(IBuilder builder)
{
builder.BuildPartA();
builder.BuildPartB();
}
}
public interface IBuilder
{
void BuildPartA();
void BuildPartB();
Product GetResult();
}
public class ConcreteBuilder1 : IBuilder
{
private Product product;
public ConcreteBuilder1()
{
this.product =new Product();
}
public void BuildPartA()
{
product.Add("PartA");
}
public void BuildPartB()
{
product.Add("PartB");
}
public Product GetResult()
{
return product;
}
}
public class ConcreteBuilder2 : IBuilder
{
private Product product;
public ConcreteBuilder2()
{
this.product = new Product();
}
public void BuildPartA()
{
product.Add("PartX");
}
public void BuildPartB()
{
product.Add("PartY");
}
public Product GetResult()
{
return product;
}
}
public class Product
{
List<string> lst = new List<string>();
public void Add(string part)
{
lst.Add(part);
}
public void ShowResult()
{
foreach (string part in lst)
{
Console.WriteLine(part);
}
}
}
实现要点:
1. 建造者模式主要用于“分步骤构建一个复杂的对象”,在这其中“分步骤”是一个稳定的算法,而复杂对象的各个部分则经常变化。
2. 产品不需要抽象类,特别是由于创建对象的算法复杂而导致使用此模式的情况下或此模式应用于产品的生成过程,其最终结果可能差异很大,不大可能提炼出一个抽象产品类。
3. 创建者中的创建子部件的接口方法不是抽象方法而是空方法,不进行任何操作,具体的创建者只需要覆盖需要的方法就可以。
4. 抽象工厂模式解决“系列对象”的需求变化,而Builder模式解决“对象部分”的需求变化,建造者模式常和组合模式(Compsite Pattern)结合使用。
效果
- 建造者模式的使用使得产品的内部表象可以独立的变化。使用建造者模式可以使客户端不必知道产品内部组成的细节。
- 每一个Builder都相对独立,而与其它的Builder无关。
- 可使对构造过程更加精细控制。
- 将构建代码和表示代码分开。
- 建造模式的缺点在于难于应付“分步骤构建算法”的需求变动。
适用性:
以下情况应当使用建造者模式:
- 需要生产的产品对象有复杂的内部结构
- 需要生产的产品对象的属性相互依赖,建造者模式可以强迫生成顺序
- 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不容易得到。