这是我看得第一个模式,但却不是看懂的第一个,呵呵。。。
-
设计模式(4): 建造者模式(Builder Pattern)
-
-
-
建造者模式(Builder Pattern)
-
-
概述
-
-
建造者模式是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法确相对稳定。如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变?这就是要说的建造者模式。
-
-
建造者模式(Builder)结构图
-
-
-
-
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);
}
}
}
-
-
Builder类——抽象建造者类,确定产品由两个部件PartA和PartB组成,并声明一个得到产品建造后结果的方法GetResult.
这样在具体的建造者类中不会遗忘建造某个部件。
-
abstract class Builder
{
public abstract void BuildPartA();
public abstract void BuildPartB();
public abstract Product GetResult();
}
-
-
ConcreteBuilder类——具体建造者类。
-
class ConcreteBuilder1:Builder
{
private Product product=new Product();
public override void BuildPartA()
{
product.Add("部件A");
}
public override void BuildPartB()
{
product.Add("部件B");
}
public override Product GetResult()
{
return product;
}
}
-
-
ConcreteBuilder——具体建造者类
-
class ConcreteBuilder2:Builder
{
private Product product=new Product();
public override void BuildPartA()
{
product.Add("部件X");
}
public override void BuildPartB()
{
product.Add("部件Y");
}
public override Product GetResult()
{
return product;
}
-
-
Director类,有了此类,就避免了在客户端时调用具体建造者类的建造方法。
-
class Director
{
public void Construct(Builder builder)
{
builder.BuilderPartA();
builder.BuilderPartB();
}
}
-
- 客户端代码,客户不需要知道具体的建造过程
-
static void Main(string[] args)
{
Director director=new Director();
Builder b1=new ConcreteBuilder1();
Builder b1=new ConcreteBuilder2();
director.Construct(b1);
Product p1=b1.GetReturn();
p1.show();
director.Construct(b2);
Product p2=b2.GetReturn();
p2.show();
}
-
-
运用反射:
-
class Datatable
{
private static readonly string AssemblyName="建造者模式";
private static readonly string cb="ConcreteBuilder1";
//private static readonly string cb="ConcreteBuilder2";
public static Builder Create()
{
string className=AssemblyName+"."+cb;
return (Builder)Assembly.Load(AssemblyName).CreateInstance(className);
}
}
-
-
反射的客户端代码:
-
static void Main(string[] args)
{
Builder b=Datatable.Create();
Director director=new Director();
Director.Construct(b);
Product p=b.GetResult();
p.show();
}