设计模式-建造者模式

10 篇文章 0 订阅
10 篇文章 0 订阅

举例:画两个不同的小人,容易违反依赖倒转原则(即抽象不应该依赖细节,细节应该依赖于抽象)。容易缺胳膊少腿。最好的办法是规定建造小人的固定步骤,都有头,身体,两手两脚。即使是需要高矮胖瘦不同的小人,也可以用建造者模式设计出来。

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

分析:建造者模式可以将一个产品的内部表现与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表现的产品对象。如果使用建造者模式,只需指定需要建造的类型就能得到它们,而具体建造的过程和细节就封装在抽象的建造人的类中:

人类:抽象接口。

    abstract class PersonBuilder
    {
        protected Graphics g;
        protected Pen p;
        public PersonBuilder(Graphics g, Pen p)
        {
            this.g = g;
            this.p = p;
        }
        public abstract void BuildHead();
        public abstract void BuildBody();
        public abstract void BuildArmLeft();
        public abstract void BuildArmRight();
        public abstract void BuildLegLeft();
        public abstract void BuildLegRight();
    }

如果要建造小瘦子,继承上面的人类,实现上面的接口:具体建造者

    class PersonThinBuilder : PersonBuilder
    {
        public PersonThinBuilder(Graphics g, Pen p) : base(g, p)
        { }
        public override void BuildHead()
        {
            g.DrawEllipse(p,50,20,30,30);
        }
        public override void BuildBody()
        {
            g.DrawRectangle(p,60,50,10,50);
        }
        public override void BuildArmLeft()
        {
            g.DrawLine(p,60,50,40,100);
        }
        public override void BuildArmRight()
        {
            g.DrawLine(p,70,50,90,100);
        }
        public override void BuildLegLeft()
        {
            g.DrawLine(p,60,100,45,150);
        }
        public override void BuildLegRight()
        {
            g.DrawLine(p,70,100,85,150);
        }
    }

指挥者:(告诉指挥者我们想要什么样的人,用指挥者实现人这个接口,隔离用户与建造过程的关联。这样就不用在客户端调用时写头身手脚这些方法。)

    class PersonDirector
    {
        private PersonBuilder pb;
        //用户告诉指挥者,我要什么样的小人
        public PersonDirector(PersonBuilder pb)
        {
            this.pb = pb;
        }
        //根据用户的选择建造小人
        public void CreatePerson()
        {
            pb.BuildHead();
            pb.BuildBody();
            pb.BuildArmLeft();
            pb.BuildArmRight();
            pb.BuildLegLeft();
            pb.BuildLegRight();
        }
    }

客户端:

        private void button1_Click(object sender, EventArgs e)
        {
            Pen p = new Pen(Color.Black);
            PersonThinBuilder ptb = new PersonThinBuilder(pictureBox1.CreateGraphics(), p);
            PersonDirector pdThin = new PersonDirector(ptb);
            pdThin.CreatePerson();
        } 

如果需要胖子,就加一个胖子子类继承人类。用指挥者,指挥建造过程。

结构图:

 优点:使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,使用若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。所以说,建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值