将一个复杂对此的构建和它的 表示分离, 使得同样的构建过程可以创建不同的表示, 此时我们就需要“建造者模式”, 如果我们用了建造者模式, 那么用户就只需要知道需要建造的类型, 而无需知道具体的构建过程和细节了。
建造者模式(Builder): 将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示。
总结四大问题。
一、Builder 是什么?
是为创建一个 Product 对象的各个部件指定的抽象接口。
二、 ConcreteBuilder 是什么?
它是具体的建造者, 实现Builder 接口, 构造和装配各个部件。 Product 显然是具体的产品角色了。
三、Director 是什么?
指挥者, 它是构建一个使用Builder 接口的对象。
四、什么时候需要使用建造者模式呢?
主要用于创在一些复杂的对象, 这些对象内部构建间的构造顺序通常是稳定的, 但对象内部的构建通常面临则非常复杂的变化。
建造者模式的好处就是使得建代码与表示代码分离, 由于建造者隐藏了该产品是如何组装的, 所以若需要改变一个产品的内部表示, 只需要定义一个具体的建造者就可以了。
建造者模式解析:
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);
}
} }
Builder 类 --- 抽象建造者类, 确定产品两个部件 PartA 和 PartB 组成, 并声明一个得到产品建造后结果的方法 GetResult.
abstract class Builder{
public abstract viod BuildePartA();
public abstract viod BuildePartB();
public abstract Product GetResult();
}
ConcreteBuilder1 类 --- 具体建造者类。
class ConcreteBuilder1 :Builder{
private Product product = new Product();
public override BuildPartA(){
product.Add("部件A");
}
public override BuildPartB(){
product.Add("部件B");
}
public override Product GetResult(){
return product;
} }
ConcreteBuilder2 类 --- 具体建造者类。
class ConcreteBuilder2 :Builder{
private Product product = new Product();
public override BuildPartA(){
product.Add("部件X");
}
public override BuildPartB(){
product.Add("部件Y");
}
public override Product GetResult(){
return product;
} }
Director类 --- 指挥者类
class Director{ //用来指挥建造过程
publicv void Construct(Builder builder){
builder.BuildPartA();
builder.BuildPArtB();
}
}
客户端代码, 客户不需要知道具体的建造过程:
static void Main(string[] args){
Director director = new Director();
Builder b1 = new ConcreteBuilder1();
Builder b2 = new ConcreteBuilder2();
director.Construct(b1); //指挥者用ConcreteBuilder1 的方法来建造产品
Product p1 = b1.GetResult();
p1.Show();
director.Constict(b2);
Product p2 = b2.GetResult(); //指挥者用ConcreteBuilder2 的方法来建造产品
p2.Show();
Console.Read();
}
建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式。