应用情景:如果需要将一个负责对象的构建与它的表示分离,使得同样的构建过程可以创建不同的对象的意图时候,就可以使用建造者模式。
产品类—Product
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Builder_Model
{
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组成,并声明一个得到产品建造者后 的方法GetRseult();
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Builder_Model
{
abstract class Builder
{
public abstract void BuildPartA();
public abstract void BuildPartB();
public abstract Product GetResult();
}
}
具体建造者类——1
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Builder_Model
{
class ConcreteBuilder : 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;
}
}
}
具体建造者——2
在这里插入代码片using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Builder_Model
{
class ConcreteBuilder2 : Builder
{
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Builder_Model
{
class Director
{
public void Construct(Builder builder)
{
builder.BuildPartA();
builder.BuildPartB();
}
}
}
客户端
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Builder_Model
{
class Program
{
static void Main(string[] args)
{
Director director = new Director();
Builder builder1 = new ConcreteBuilder();
director.Construct(builder1);
Product p1 = builder1.GetResult();
p1.Show();
Console.ReadKey();
}
}
}
总结:指挥者Director只需要知道建造的类型 也就是他想建造出A类产品还是B类产品 具体的细节封装在内部完成 也就是指挥者并不需要去关心。