意图
将一个复杂对象的构建与表示分离,使得同样的构造过程可以创建不同的表示
适用性
- 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式
- 当构造过程必须允许被构造对象由不同的表示
结构
参与者
-
Bulider
- 为创建一个Product对象的各个部件指定抽象接口
-
ConcreteBulider
- 实现Bulider的接口以构造和装配该产品的各个部件
- 定义并明确它所创建的表示
- 提供一个检索产品的接口
- Director
- 构造一个使用Bulider接口的对象
- Product
- 表示被构造的复杂对象。ConcreteBulider创建该产品的内部表示并定义它的装配过程
- 包含定义组成部件类,包括将这些部件装配成最终产品的接口
协作
- 客户创建Director对象,并用它所想要的Bulider对象进行配置。
- 一旦产品部件被生成,导向器就会通知生成器
- 生成器处理导向器的请求,并将部件添加到产品中
- 客户从生成器中检索该产品
效果
- 它使你可以改变一个产品的内部表示
- 它将构造代码和表示代码分离
- 它使你可对构造过程进行更精细的控制
实现
- 装配和构造接口
- 为什么产品没有抽象类
- 在Bulider中缺省的方法为空
示例代码
class BuliderStructure
{
public void Test()
{
Director _director = new Director();
Bulider b1 = new ConcreteBulider1();
Bulider b2 = new ConcreteBulider2();
_director.Construct(b1);
Product p1 = b1.GetResult();
p1.Show();
_director.Construct(b2);
Product p2 = b2.GetResult();
p2.Show();
}
}
class Director
{
public void Construct(Bulider bulider)
{
bulider.BulidPartA();
bulider.BulidPartB();
}
}
abstract class Bulider
{
public abstract void BulidPartA();
public abstract void BulidPartB();
public abstract Product GetResult();
}
class ConcreteBulider1 : Bulider
{
private Product _product = new Product();
public override void BulidPartA()
{
_product.Add("Part A");
}
public override void BulidPartB()
{
_product.Add("Part B");
}
public override Product GetResult()
{
return _product;
}
}
class ConcreteBulider2 : Bulider
{
private Product _product = new Product();
public override void BulidPartA()
{
_product.Add("Part X");
}
public override void BulidPartB()
{
_product.Add("Part Y");
}
public override Product GetResult()
{
return _product;
}
}
class Product
{
private List<string> _str = new List<string>();
public void Add(string str)
{
_str.Add(str);
}
public void Show()
{
Console.WriteLine("\n Product parts.......");
foreach (string str in _str)
{
Console.WriteLine(str);
}
}
}
输出为:
Product parts.......
Part A
Part B
Product parts.......
Part X
Part Y
源码:https://github.com/RoseAangle/Unity_Desigin_Pattern
如有问题,欢迎斧正!!!