建造者模式与抽象工厂有些相似。抽象工厂是一个工厂可以生产出多个商品,所有的工厂模式都只注重产品而不注重产品构造的细节也就是一个产品是如何生产出来的?而建造者模式则注重产品构建细节。建造者模式要求建造过程稳定。以煮汤为例,假如所有的汤都需要清洗材料、放入锅中,加水和调料、煮沸出锅这些步骤。那么明显这个例子适合用建造者模式,因为步骤也就是过程是稳定的,而用这个步骤炒菜则是不合适的,因为炒菜的步骤可能要更复杂一些。建造者模式必须有三个对象:产品、建造者、指挥者。产品就是本例的汤,建造者细分为抽象建造者和具体建造者,抽象建造者定义了一系列步骤,具体建造者遵循抽象建造者的规则做具体的实现,而指挥者则合成步骤。
以煮鸡汤为例的代码如下:
public class Tang//产品
{
private string name;
private List<string> steps;
public Tang(string name)
{
this.name = name;
steps = new List<string>();
}
public void SetSteps(string step)
{
steps.Add(step);
}
public void ShowSetps()
{
Console.WriteLine(name);
Console.WriteLine("制作步骤");
for (int i = 0; i < steps.Count; i++)
{
Console.WriteLine(steps[i]);
}
}
}
public abstract class Builder//抽象建造者
{
public abstract void QingXiCaiLiao();
public abstract void FangRuGuoZhong();
public abstract void FangTiaoLiao();
public abstract void ShaoFeiChuGuo();
public abstract void ShowSetps();
}
public class JiTang : Builder//具体建造者
{
private Tang jitang=new Tang("鸡汤");
public override void QingXiCaiLiao()
{
jitang.SetSteps("清洗鸡肉");
}
public override void FangRuGuoZhong()
{
jitang.SetSteps("将鸡肉放入锅里");
}
public override void FangTiaoLiao()
{
jitang.SetSteps("加水,放调料");
}
public override void ShaoFeiChuGuo()
{
jitang.SetSteps("大火烧开,出锅咯");
}
public override void ShowSetps()
{
jitang.ShowSetps();
}
}
public class Director//指挥者
{
public void MakeTang(Builder tang)
{
tang.QingXiCaiLiao();
tang.FangRuGuoZhong();
tang.FangTiaoLiao();
tang.ShaoFeiChuGuo();
tang.ShowSetps();
}
}
//客户端调用
Builder builder = new JiTang();
Director director = new Director();
director.MakeTang(builder);
如果后期要加上排骨汤,也很简单,加一个排骨汤的类继承自抽象建造者类,实现其相关接口,就可以通过代码做出排骨汤啦。