建造者模式——画胖小人和瘦小人

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

  使用场景:

  • 创建复杂对象的算法应该独立于该对象的组成部分,以及他们的装配方式时。
  • 当构造过程必须允许被构造的对象有不同表示时。

  例子背景:甲方需求是画出胖小人或瘦小人,到底要画哪个不确定,并且不想了解画小人的过程。乙方把任务交给指挥者,让画胖小人的画手1和画瘦小人的画手2都听指挥者的命令,指挥者知道画图的方法是画头、画身子、画四肢。指挥者让谁画谁就画,并且监督画手严格按照画图方法来画,绝不会导致画的图缺胳膊少腿,这样两个画手通过一样的画图方法分别画出了胖小人和瘦小人。
在这里插入图片描述
建造人类:抽象类

    abstract  class PersonBuilder	//建造小人是个抽象类
    {
        protected Graphics g;		//添加命名空间using System.Drawing;
        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);
        }
    }

建造胖小人略,改改画图参数即可。

Director指挥者类:指挥建造过程

    class PersonDirector    //建造指挥者
    {
        private PersonBuilder pb;
            
        //甲方告诉指挥者需要什么样的小人,这里pb可以是PersonBuilder类或它的子类对象
        public PersonDirector(PersonBuilder pb) 
        {
            this.pb = pb;
        }
        public void CreatePerson()	//不同的子类对象调用各自的内部方法
        {
            pb.BuildHead();
            pb.BuildBody();
            pb.BuildArmLeft();
            pb.BuildArmRight();
            pb.BuildLegLeft();
            pb.BuildLegRight();
        }
    }

窗体代码:客户不需要知道具体建造过程

        Pen p = new Pen(Color.Yellow);
        private void pictureBox1_Click(object sender, EventArgs e)
        {	//CreateGraphics ()方法的作用是为控件创建Graphics
            PersonThinBuilder ptb = new PersonThinBuilder(pictureBox1 .CreateGraphics (),p);
            PersonDirector pdThin = new PersonDirector(ptb);
            pdThin.CreatePerson()//指挥用画瘦小人的方法画图
        }

        private void pictureBox2_Click(object sender, EventArgs e)
        {
            PersonFatBuilder pfb = new PersonFatBuilder(pictureBox2 .CreateGraphics (),p);
            PersonDirector pdFat = new PersonDirector(pfb);
            pdFat.CreatePerson();//指挥用画胖小人的方法画图
        }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

夏诗曼CharmaineXia

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

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

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

打赏作者

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

抵扣说明:

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

余额充值