1.Builder Pattern 建造者模式
结构图:
概述:
在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法确相对稳定。如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变?这就是要说的建造者模式。
意图:
将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
结构说明:
由客户端程序创建一个Director(指导者类)和一个Buider(构建各个部门的接口类),由ConcreteBuider(具体的构造类),实现Buider类接口,构造和装配各个部件,由客户端通过调用Product(产品类)得到对象的创建。
示例代码:
客户端:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System;
using System.Collections.Generic;
using System.Text;
namespace Builder
{
class Program
{
static void Main(string[] args)
{
Director di = new Director();
IBuider buider = new ConcreteBuilder();
di.Construct(buider);
Product pr = buider.GetResult();
Console.WriteLine(pr.show());
Console.ReadLine();
}
}
}
using System.Collections.Generic;
using System.Text;
namespace Builder
{
class Program
{
static void Main(string[] args)
{
Director di = new Director();
IBuider buider = new ConcreteBuilder();
di.Construct(buider);
Product pr = buider.GetResult();
Console.WriteLine(pr.show());
Console.ReadLine();
}
}
}
Director(指导者类):
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System;
using System.Collections.Generic;
using System.Text;
namespace Builder
{
public class Director
{
public void Construct(IBuider buider)
{
buider.BuiderA();
buider.BuiderB();
}
}
}
using System.Collections.Generic;
using System.Text;
namespace Builder
{
public class Director
{
public void Construct(IBuider buider)
{
buider.BuiderA();
buider.BuiderB();
}
}
}
Buider(构建各个部门的接口类):
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System;
using System.Collections.Generic;
using System.Text;
namespace Builder
{
public interface IBuider
{
void BuiderA();
void BuiderB();
Product GetResult();
}
}
using System.Collections.Generic;
using System.Text;
namespace Builder
{
public interface IBuider
{
void BuiderA();
void BuiderB();
Product GetResult();
}
}
ConcreteBuider(具体的构造类):
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System;
using System.Collections.Generic;
using System.Text;
namespace Builder
{
public class ConcreteBuilder:IBuider
{
Product pr = new Product();
public void BuiderA()
{
pr.Add("第一部分");
}
public void BuiderB()
{
pr.Add("第二部分");
}
public Product GetResult()
{
return pr;
}
}
}
using System.Collections.Generic;
using System.Text;
namespace Builder
{
public class ConcreteBuilder:IBuider
{
Product pr = new Product();
public void BuiderA()
{
pr.Add("第一部分");
}
public void BuiderB()
{
pr.Add("第二部分");
}
public Product GetResult()
{
return pr;
}
}
}
Product(产品类)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System;
using System.Collections.Generic;
using System.Text;
namespace Builder
{
public class Product
{
List<string> pr = new List<string>();
public void Add(string str)
{
pr.Add(str);
}
public string show()
{
string Proud = "";
foreach (string s in pr)
{
Proud += s + ";";
}
return Proud;
}
}
}
using System.Collections.Generic;
using System.Text;
namespace Builder
{
public class Product
{
List<string> pr = new List<string>();
public void Add(string str)
{
pr.Add(str);
}
public string show()
{
string Proud = "";
foreach (string s in pr)
{
Proud += s + ";";
}
return Proud;
}
}
}