建造者模式
Builder,将一个复杂的对象构建与他的表示分离,使得同样的构建过程可以创建不同的表示的意图。
代码构造
角色
Builder是为创建一个Product对象的各个部件指定的抽象接口。
ConcreteBuilder是具体的建造者,实现Builder接口,构造和装配各个部件。
Product指具体的产品角色
Director是指挥者,构建一个使用Builder接口的对象
代码
class ConcreteBuilder1:Builder
{
private Product product = new Product();
//建造具体的两个部件是部件A和部件B
public override void BuilderPartA()
{
product.Add("部件A");
}
public override void BuilderPartB()
{
product.Add("部件B");
}
public override Product GetResult()
{
return product;
}
}
class ConcreteBuilder2 : Builder
{
private Product product = new Product();
//建造具体的两个部件是部件X和部件Y
public override void BuilderPartA()
{
product.Add("部件X");
}
public override void BuilderPartB()
{
product.Add("部件Y");
}
public override Product GetResult()
{
return product;
}
}
抽象建造者Builder:
abstract class Builder
{
public abstract void BuilderPartA();
public abstract void BuilderPartB();
public abstract Product GetResult();
}
指挥者Dirctor:
class Director
{
//指挥建造过程
public void Construct (Builder builder)
{
builder.BuilderPartA();
builder.BuilderPartB();
}
}
具体产品Product:
class Product
{
IList<string> parts = new List<string>();
public void Add(string part)
{
parts.Add(part); //添加产品部件
}
public void Show()
{
Console.WriteLine("\n产品 创建——");
foreach (string part in parts) //列举所有的产品部件
{
Console.WriteLine(part);
}
}
}
创造出来产品,客户端代码:
class Program
{
//调用方法,建造产品
static void Main(string[] args)
{
Director director = new Director();
Builder b1 = new ConcreteBuilder1();
Builder b2 = new ConcreteBuilder2();
director.Construct(b1);
Product p1 = b1.GetResult(); //指挥者用ConcreteProduct1的方法来建造产品
p1.Show();
director.Construct(b2);
Product p2 = b2.GetResult(); //指挥者用ConcreteProduct2的方法来建造产品
p2.Show();
Console.ReadKey();
}
}
使用环境
建造者模式主要是用与创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的。但对象内部的构建同窗面临着复杂的变化。建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式时使用的模式
1、需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性。
2、隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。
分类扩展
省略掉抽象建造者角色
如果系统中只需要一个具体的建造者的话,可以省略掉抽象建造者
省略掉指导者角色
在具体建造者只有一个的情况下,如果抽象建造者角色已经被省略掉,那么还可以省略掉指导者角色,让Builder自己扮演指导者和建造者双重角色。
优点
2、将产品的创建过程与产品本身分离开来,可以使用相同的创建过程来得到不同的产品。也就说细节依赖抽象。
3、每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。
缺点
1、建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
2、如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。