建造者模式适用于过程稳定但过程中的每一个步骤的实现因产品不同而有不同的实现。也可以是:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
个人认为建造者模式只是体现了面向对象的思想,如果说是过程相同而每一步的实现不同的话,这完全是用面向对象的多态就可以解释的。如果认为一个工程中的逻辑是这样子的,也可以这样理解。(不知道是否正确),在抽象接口中定义好所有的任务,这样就好了。
建造者模式中体现了面向对象编程的设计:依赖倒转原则(面向接口编程,而不是面向细节编程,这是最基本的,遇到一个问题,先抽象再考虑具体),开放-封闭原则(对扩展开放,对修改封闭,在建造者模式中一样,一旦接口或者抽象类写好之后就不能再修改了,否则会吃不消的),里氏代换原则(子类型必须能够替换掉它们的父类型,也就是向上转换);还有就是迪米特法则(如果两个类不必彼此直接通信,那么这两个类就不必发生直接的相互作用。如果其中一个类调用另一个类的话,可以通过第三者转发这个调用)。
下面贴上一个简单的代码,不知道这个是否足以表示建造者模式。
namespace BuilderModel
{
abstract class Builder
{
abstract public void Daji();
abstract public void Qizhuan();
abstract public void Decaration();
}
class Conducter //隔离客户端和实际的建造类,体现了迪米特法则
{
private Builder builder;
public Conducter(Builder builder)
{
this.builder = builder;
}
public void createRoom()
{
builder.Daji();
builder.Qizhuan();
builder.Decaration();
}
}
class HighRoom:Builder
{
public override void Daji()
{
Console.WriteLine("高房子沏砖," + this.GetType().ToString());
}
public override void Qizhuan()
{
Console.WriteLine("高房子沏砖," + this.GetType().ToString());
}
public override void Decaration()
{
Console.WriteLine("高房子装饰," + this.GetType().ToString());
}
}
class LowerRoom:Builder
{
public override void Daji()
{
Console.WriteLine("低房子打桩,"+this.GetType().ToString());
}
public override void Qizhuan()
{
Console.WriteLine("低房子沏砖," + this.GetType().ToString());
}
public override void Decaration()
{
Console.WriteLine("低房子装饰," + this.GetType().ToString());
}
}
class Program
{
static void Main(string[] args)
{
Builder builderLow = new LowerRoom();
Conducter low = new Conducter(builderLow);
low.createRoom();
Console.WriteLine("\n");
Builder builderHigh = new HighRoom();
Conducter high = new Conducter(builderHigh);
high.createRoom();
Console.ReadKey();
}
}
}
运行结果: