极速理解设计模式系列:1.建造者模式(Builder Pattern)
4个角色:指挥者(Director),建造者(Builder),具体建造者(ConcreteBuilder),产品(Product)
产品:需要创建的对象产品
具体建造者:创建产品的实例并且实现建造者多个方法对产品进行装配
建造者:本质为抽象类,里面的抽象方法供具体建造者重写,声明产品的引用
指挥者:调用建造者抽象类以及其方法
实现思路:客户端创建一个指挥者,并且实例化需要的产品的具体建造者,然后指挥者调用具体建造者的实例即将产品生产出来。
类图:
应用场景:在Silverlight中我们需要生产一列多行的输入框+TextBlock的组合,但是这些输入框的类型不同,有一些只能输入256个字符,有的只能输入20个字符,还有的是多行的,有的是单行的输入框。这些输入框的种类是固定的,但是可能用户自定义输入框的时候我们生成的顺序和各自的生成数量不知道。
分析:在这里产品是固定的,有A,B,C,D,E,F六种输入框+TextBlock,用户可能生成的情况是A,A,C,C,B,B,C、也可能是B,C,D,B,C,F。这里我们使用建造者模式,这几种输入框基本上都差不多,都是TextBlock+TextBox的模式。但是可输入数量和是否多行是不定的,那么我们实现AConcreteBuilder,BConcreteBuilder,CConcreteBuilder,DConcreteBuilder,EConcreteBuilder,FConcreteBuilder等多个具体建造者,然后对于建造者中只需要两个方法分别实例化产品,并且对产品的属性(可输入字符数、是否可多行)进行设置,然后再用户需要调用什么产品的时候,使用指挥者调用想要的ConcreteBuilder具体建造者即可。
下面我们以一个电脑产品生产的实例来具体看看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();
}
}