设计模式学习(五) —— 生成器模式
简介
生成器模式,有的书上也翻译成建造者模式,是一种意图将一个复杂的构建过程与其表示相分离,使得同样的构建过程可以创建不同的表示形式,也就是说,这个复杂对象的组成过程相对来说是比较固定的,但是组成它的元素可能是变化的。拿我们熟悉的电脑来举例,建造电脑的过程中,装主板、显卡、内存等过程都是必要的,但是这些元件都可以换用不同厂商的产品。根据OOD设计原则之OCP原则(开闭原则),我们应该对这个组装过程进行封装。
一个例子
我们以去电脑城购买组装电脑的过程来说明生成者模式。
在电脑城中有许许多多的电脑组装店,作为消费者,我们首先要找到电脑店的老板,说明我们要什么样的电脑。但是一般来说,老板都不会亲自为你装配电脑,而是交给手下的人员来做。那么在这个例子中,老板就是生成者模式中的指挥者,他的手下就是生成者模式中的建造者。
public class Custome
{
static void Main(string[] args)
{
Boss boss = new Boss();
Stuff xiaoli = new StuffOne();
Stuff xiaowang = new StuffTwo();
boss.ConstructComputer(xiaoli);
Computer computer_one = xiaoli.GetComputer();
computer_one.PrintInfo();
Computer computer_two = xiaowang.GetComputer();
computer_two.PrintInfo();
Console.Read();
}
}
class Boss()
{
public void ConstructComputer(Stuff s)
{
s.BuildMainBoard();
s.BuildMemory();
s.BuildDisplay();
s.BuildHardDrive();
}
}
class Computer
{
private string _mainboard;
private string _memory;
private string _display;
private string _harddrive;
public string MainBoard
{
get;set;
}
public string Memory
{
get;set;
}
public string Display
{
get;
set;
}
public string HardDrive
{
get;
set;
}
public void PrintInfo()
{
Console.WriteLine("电脑信息:主板{0},内存{1},显示器{2},硬盘{3}",_mainboard,_memory,_display,_harddrive);
}
}
public abstract Stuff
{
public abstract void BuildDisplay();
public abstract void BuildMemory();
public abstract void BuildHardDrive();
public abstract void BuildMainBoard();
}
class StuffOne:Stuff
{
Computer computer = new Computer();
public override void BuildMainBoard()
{
computer.MainBoard = "技嘉";
}
public override void BuildMemory()
{
computer.Memory = "三星";
}
public override void BuildDisplay()
{
computer.Display = "戴尔";
}
public override void BuildHardDrive()
{
computer.HardDrive = "西数";
}
public Computer GetComputer()
{
return computer;
}
}
public class StuffTwo:Stuff
{
Computer computer = new Computer();
public override void BuildDisplay()
{
computer.Display = "三星";
}
public override void BuildMemory()
{
computer.Memory = "海力士";
}
public override void BuildMainBoard()
{
computer.MainBoard = "华硕";
}
public override void BuildHardDrive()
{
computer.HardDrive = "东芝";
}
public Computer GetComputer()
{
return computer;
}
}
生成者模式的分析
- 生成器允许改变生成的产品的内部表示,并且隐藏了产品组装的过程。在本例中,顾客并不关心电脑是怎么组装起来的,店员也不向顾客展示组装的过程。
- 每个特定的生成器都独立于其他生成器和程序的其他部分。在本例中,假设又来了一名顾客,那么只需要再new 一个新的stuf子类对象。
- 因为每个生成器都是根据数据来逐步组装产品的,所以对于构造的整个过程可以进行更多的控制。