建造者模式
意图
将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
有些产品结构比较复杂,构成产品的零件有许多个,这许多个零件又没有什么关系,并且这些零件的组合是有必须的顺序的,比如在实现对数据库查询过程中,要实现一下步骤:1.实例化数据库连接对象SqlConnection;2实例化sql命令对象SqlCommand;3.设定sql命令对象的sql语句和参数;4.打开数据库连接;5.执行sql命令对象,并返回结果;6,关闭数据库连接。在刚学编程的时候,我们可能会在每个页面需要访问数据库的地方重复上面的步骤写一段代码。但如果采用了建造者模式,将实例化sql命令对象的复杂过程封装到一个类中,这样实现访问的代码和操作就变的简单多了。
综上,在以下情况下使用建造者模式:
1. 有许多的零件类要通过一种必须的顺序构成一个产品类,就应该使用建造者模式,这时可以有也可以没有指导者角色
2. 如果这些零件要组成的产品类不止一个,需要指导者角色
3. 如果产品类不止一类,则需要抽象指导者角色,构造多个指导者角色的实体类
下面我们以一个电脑产品生产的实例来具体看看Builder Pattern是如何使用的:
一、产品角色
//产品
class Computer
{
private string m_CompName;
private string m_MemorySize;
private string m_DiskSize;
/// <summary>
/// 电脑名称
/// </summary>
public string CompName
{
get { return m_CompName; }
set { m_CompName = value; }
}
/// <summary>
/// 内存大小
/// </summary>
public string MemorySize
{
get { return m_MemorySize; }
set { m_MemorySize = value; }
}
/// <summary>
/// 硬盘大小
/// </summary>
public string DiskSize
{
get { return m_DiskSize; }
set { m_DiskSize = value; }
}
/// <summary>
/// 显示产品的信息
/// </summary>
public void ShowComputerInfo()
{
Console.WriteLine("------------------------");
Console.WriteLine("电脑名称:" + CompName);
Console.WriteLine("内存大小:" + MemorySize);
Console.WriteLine("硬盘大小:" + DiskSize);
}
}
二、建造者角色
//建造者 定义建造产品的抽象方法和产品的引用
abstract class ComputerBuilder
{
private Computer computerInstance;
/// <summary>
/// 返回建立的电脑产品实例
/// </summary>
public Computer ComputerInstance
{
get { return computerInstance; }
set { computerInstance=value; }
}
/// <summary>
/// 创建电脑名称
/// </summary>
abstract public void CreateCompName();
/// <summary>
/// 创建电脑内存
/// </summary>
abstract public void CreateCompMemory();
/// <summary>
/// 创建电脑硬盘
/// </summary>
abstract public void CreateCompDisk();
}
三、具体建造者角色
//具体建造者创建苹果电脑
class AppleConcreteBuilder : ComputerBuilder
{
public override void CreateCompName()
{
ComputerInstance = new Computer();
ComputerInstance.CompName = "苹果电脑";
}
public override void CreateCompMemory()
{
ComputerInstance.MemorySize = "4G";
}
public override void CreateCompDisk()
{
ComputerInstance.DiskSize = "500G";
}
}
//具体建造者创建戴尔电脑
class DellConcreteBuilder : ComputerBuilder
{
public override void CreateCompName()
{
ComputerInstance = new Computer();
ComputerInstance.CompName = "戴尔电脑";
}
public override void CreateCompMemory()
{
ComputerInstance.MemorySize = "2GB";
}
public override void CreateCompDisk()
{
ComputerInstance.DiskSize = "320GB";
}
}
//具体建造者创建惠普电脑
class HpConcreteBuilder : ComputerBuilder
{
public override void CreateCompName()
{
ComputerInstance = new Computer();
ComputerInstance.CompName = "惠普电脑";
}
public override void CreateCompMemory()
{
ComputerInstance.MemorySize = "1GB";
}
public override void CreateCompDisk()
{
ComputerInstance.DiskSize = "160GB";
}
}
//具体建造者创建IBM电脑
class IBMConcreteBuilder : ComputerBuilder
{
public override void CreateCompName()
{
ComputerInstance = new Computer();
ComputerInstance.CompName = "IBM电脑";
}
public override void CreateCompMemory()
{
ComputerInstance.MemorySize = "2G";
}
public override void CreateCompDisk()
{
ComputerInstance.DiskSize = "1000G";
}
}
四、指挥者角色
//指挥者
class CreateDirector
{
/// <summary>
/// 调用建造者抽象方法以生产产品
/// </summary>
/// <param name="compBuilder"></param>
public void CreateComputer(ComputerBuilder compBuilder)
{
compBuilder.CreateCompName();
compBuilder.CreateCompMemory();
compBuilder.CreateCompDisk();
}
}