设计模式之建造者模式

定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示。

那什么是将一个复杂对象的构造与表示分离呢?下面将举一个例子说明。

传说中,我们人类是由女娲创造的,通过拼凑头、身体、手、脚等部位完成,于是有了以下的程序:

public class Godness
{
    public void BuildPeople()
    {
        Console.WriteLine("建造头");
        Console.WriteLine("建造身体");
        Console.WriteLine("建造手");
        Console.WriteLine("建造脚");
        Console.WriteLine("得到人");
    }
}

但是女娲觉得还不满意,觉得需要分为男人和女人,于是有了以下的程序:

public class Godness
{
    public void BuildMen()
    {
        Console.WriteLine("建造头");
        Console.WriteLine("建造男人身体");
        Console.WriteLine("建造手");
        Console.WriteLine("建造脚");
        Console.WriteLine("得到男人");
    }

    public void BuildWomen()
    {
        Console.WriteLine("建造头");
        Console.WriteLine("建造女人身体");
        Console.WriteLine("建造手");
        Console.WriteLine("建造脚");
        Console.WriteLine("得到女人");
    }
}

但是女娲觉得还是不满意,得区别高矮胖瘦,这样就不得不继续修改原本的程序,这就违背了开闭原则

其实不难发现,以上不论男人,女人,胖子,瘦子,都具备同样的创造过程,把头部,身体,手,脚创造出来然后拼凑完成。

这种具有相同的构造过程,而具体每个部分细节不同的需求,就可以用建造者模式来完成了。

于是有了以下程序:

//具体人
public class People
{

}

/// <summary>
/// 建造指挥者
/// </summary>
public class GodDirector
{
    public People Construct(IPeopleBuilder builder)
    {
        builder.BuildHead();
        builder.BuildBody();
        builder.BuildHand();
        builder.BuildLeg();
        return builder.GetResult();
    }
}

/// <summary>
/// 人类建造过程 这里就是指前面定义里的构造
/// </summary>
public abstract class IPeopleBuilder
{
    protected People people = new People();
    public abstract void BuildHead();
    public abstract void BuildBody();
    public abstract void BuildHand();
    public abstract void BuildLeg();
    public abstract People GetResult();
}
//Men.cs 男人建造表达 指定义里面的表示
public class Men : IPeopleBuilder
{
    public override void BuildBody()
    {
        Console.WriteLine("建造男人的身体");
    }

    public override void BuildHand()
    {
        Console.WriteLine("建造男人的手");
    }

    public override void BuildHead()
    {
        Console.WriteLine("建造男人的头");
    }

    public override void BuildLeg()
    {
        Console.WriteLine("建造男人的腿");
    }

    public override People GetResult()
    {
        Console.WriteLine("得到男人");
        return people;
    }
}
//Women.cs
public class Women : IPeopleBuilder
{
    public override void BuildBody()
    {
        Console.WriteLine("建造女人的身体");
    }

    public override void BuildHand()
    {
        Console.WriteLine("建造女人的手");
    }

    public override void BuildHead()
    {
        Console.WriteLine("建造女人的头");
    }

    public override void BuildLeg()
    {
        Console.WriteLine("建造女人的腿");
    }

    public override People GetResult()
    {
        Console.WriteLine("得到女人");
        return people;
    }
}
static void Main(string[] args)
{
    GodDirector god = new GodDirector();
    god.Construct(new Men());
    Console.WriteLine("");
    god.Construct(new Women());
    Console.ReadLine();
}

这里就能根据不同的建造者实现相同的构造过程,如果以后需要增加其他什么动物,也有头身体手腿什么的,就不用修改原本的建造过程,直接新建一个脚本,然后实现抽象类就可以完成。

具体UML图():

回到目录 上一篇 下一篇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漫步云巅Kim

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值