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

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

 建造者模式(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
0
0
0
5
分享
相关文章
【C语言函数调用详解】——传值调用&传址调用
【C语言函数调用详解】——传值调用&传址调用
508 0
JAVA设计模式11:组合模式,以统一的方式处理单个对象和组合对象
JAVA设计模式11:组合模式,以统一的方式处理单个对象和组合对象
199 0
解决An exception occurred processing JSP page
解决An exception occurred processing JSP page
384 0
【2024泰迪杯】A 题:生产线的故障自动识别与人员配置 Python代码实现
本文提供了2024泰迪杯A题“生产线的故障自动识别与人员配置”的Python代码实现,包括问题分析、故障数据特征分析、故障报警模型构建、故障时长计算、产量与合格率分析以及操作人员排班方案制定的详细步骤和代码示例。
137 3
【2024泰迪杯】A 题:生产线的故障自动识别与人员配置 Python代码实现
2、CSS动画之行走的米兔、奔跑的小人
2、CSS动画之行走的米兔、奔跑的小人
306 0
《23种设计模式(Java版)》| 建造者模式(内附源码案例)。
建造者模式是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
《23种设计模式(Java版)》| 建造者模式(内附源码案例)。
《零基础》MySQL 删除数据库(六)
使用普通用户登陆 MySQL 服务器,你可能需要特定的权限来创建或者删除 MySQL 数据库,所以我们这边使用 root 用户登录,root 用户拥有最高权限。 在删除数据库过程中,务必要十分谨慎,因为在执行删除命令后,所有数据将会消失。
151 0
《零基础》MySQL 删除数据库(六)

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等