设计模式学习笔记之 Builder
Builder模式是用来创建一种相对复杂的对象,这种对象的各个部分的变化比较剧烈,而将这些部分组合起来的算法却是比较稳定。利用Builder模式,我们可以将复杂对象的构建和表示分离开,使得同样的构建过程可以创建不同的对象。
这里我举一个装机的例子:机器就是一个相对复杂的对象,有许多配置可以挑选,而将它们组合起来的方法是固定的。
public abstract class CPU
{
}
public abstract class MainBoard
{
}
public abstract class HardDisk
{
}
public abstract class ComputerBuilder
{
public abstract void CPUBuilder();
public abstract void MainBoardBuilder();
public abstract void HardDiskBuilder();
public abstract Computer GetComputer();
}
public abstract class Computer
{
}
这里的Computer都是由CPU,HardDisk,MainBoard组成,而且组合它们的方法相对稳定,这样当我们要具体实现的时候:
public class MyCPU : CPU
{
//…
}
public class MyMainBoard : MainBoard
{
//…
}
public class MyHardDisk : HardDisk
{
//…
}
public class MyComputer : Computer
{
//…
}
public class MyComputerBuilder : ComputerBuilder
{
public override void CPUBuilder()
{
//… 选择我的CPU
}
public override void MainBoardBuilder()
{
//… 选择我的MainBoard
}
public override void HardDiskBuilder()
{
//… 选择我的HardDisk
}
public override Computer GetComputer()
{
return new MyComputer();
}
}
上面这段代码用继承自CPU等抽象类的类来表示我所需要的配置,继承自ComputerBuilder的 MyComputerBuilder来构建Computer
public class Manager
{
public Computer ComputerManager(ComputerBuilder builder)
{
//按要求在这里Build 稳定的部分
builder.CPUBuilder();
builder.HardDiskBuilder();
builder.MainBoardBuilder();
builder.HardDiskBuilder();
return builder.GetComputer();
}
}
这里定义了Computer内部的组合方法,也是我们需要保持稳定的部分。这里我们可以看到,所有计算机都是由1CPU,1MainBoard,2HardDisk组成,是不会发生剧烈变化的。当应用时:
private static void BuilderTest()
{
Manager myManager = new Manager();
Computer myComputer = myManager.ComputerManager(new MyComputerBuilder());
}
当我们要另一种Computer时,只要添加新的继承自ComputerBuilder的类,在CPUBulider等中构建所需要的配置,并在上面修ComputerManager的参数即可,不需要修改Manager,它们之间不存在任何依赖,也就是构建和表示分离了。
和上一篇相同,我们可以通过反射的方法来创建ComputerBuilder,这样就可以通过修改配置文件来达到构建不同Computer的目的了。
Builder和Abstract Factory有很多相似之处,但是它们还是有差别的,Abstract Factory的对象之间是有紧耦合关系的,它只能在不同系列之间变换。Builder的对象是同属于一个基本对象的子对象,每个部分都是可以变化的,在上例中就可以看到,CPU等部件都是可以在CPUBuilder()中选择不同的配置的,它们之间并没有引用关系。
参考: MSDNWebCast C#设计模式纵横谈 李建忠

浙公网安备 33010602011771号