建造者模式简介
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
建造者模式的组成
- Director:建造者模式的指挥者,该类可以指定哪一个建造者进行生产产品
- Builder:建造者抽象类,该类中定义了建造者具体类必须实现的接口(方法),各个建造者具体类,必须继承自该类
- Product:产品类,建造者所要生产的产品,该类包含了建造产品所需的各个组件(产品的组成部分),及实现组件的方法等
使用场景
主要解决在软件系统中,有时候面临着”一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
案例
例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象,它是由CPU、主板、硬盘、显卡、机箱等组装而成的,如果此时让采购员一台一台电脑去组装的话真是要累死采购员了,这里就可以采用建造者模式来解决这个问题,我们可以把电脑的各个组件的组装过程封装到一个建造者类对象里,建造者只要负责返还给客户端全部组件都建造完毕的产品对象就可以了。然而现实生活中也是如此的,如果公司要采购一批电脑,此时采购员不可能自己去买各个组件并把它们组织起来,此时采购员只需要像电脑城的老板说自己要采购什么样的电脑就可以了,电脑城老板自然会把组装好的电脑送到公司。下面就以这个例子来展开建造者模式的介绍。
建造者模式UML图
建造者模式的实现
Builder:
using System;
namespace DesignModelDemo.BuilderPattern
{
abstract class Builder
{
public abstract void BuildPartCPU();
public abstract void BuildPartMainBoard();
public abstract Computer GetComputer();
}
}
ConcreteBuilderWang(建造者之一):
using System;
namespace DesignModelDemo.BuilderPattern
{
class ConcreteBuilderWang : Builder
{
Computer computer = new Computer();
public override void BuildPartCPU()
{
computer.AddComputerPart("CPU_Wang");
}
public override void BuildPartMainBoard()
{
computer.AddComputerPart("MainBoard_Wang");
}
public override Computer GetComputer()
{
return this.computer;
}
}
}
ConcreteBuilderZhang (建造者之一):
using System;
namespace DesignModelDemo.BuilderPattern
{
class ConcreteBuilderZhang : Builder
{
Computer computer = new Computer();
public override void BuildPartCPU()
{
computer.AddComputerPart("CPU_Zhang");
}
public override void BuildPartMainBoard()
{
computer.AddComputerPart("Main_Zhang");
}
public override Computer GetComputer()
{
return this.computer;
}
}
}
Director:
using System;
namespace DesignModelDemo.BuilderPattern
{
class Director
{
//进行组装电脑
public void Constauct(Builder builder)
{
builder.BuildPartCPU();
builder.BuildPartMainBoard();
}
}
}
Computer(要建造的产品):
using System;
using System.Collections.Generic;
namespace DesignModelDemo.BuilderPattern
{
class Computer
{
//所有的电脑组件的集合
List<string> computerParts = new List<string>();
public void AddComputerPart(string part)
{
computerParts.Add(part);
}
public void Show()
{
Console.WriteLine("电脑开始组装...");
foreach (var part in computerParts)
{
Console.WriteLine(part+"已经组装上电脑!");
}
Console.WriteLine("电脑已经组装好...");
}
}
}
Customer:
using System;
namespace DesignModelDemo.BuilderPattern
{
class Customer
{
static void Main(string[] args)
{
Director director = new Director();
//director是建造者模式的指挥者
//builder_Wang和builder_Zhang都是建造者之一
Builder builder_Wang = new ConcreteBuilderWang();
director.Constauct(builder_Wang);
builder_Wang.GetComputer().Show();
Builder builder_Zhang = new ConcreteBuilderZhang();
director.Constauct(builder_Zhang);
builder_Zhang.GetComputer().Show();
}
}
}