【设计模式】—建造者模式

建造者模式

(Builder Pattern)

使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

建造者模式的本质是使组装过程(用指挥者类进行封装,从而达到解耦的目的)和创建具体产品解耦,使我们不用去关心每个组件是如何组装的。

优点:

1、建造者独立,易扩展。
2、便于控制细节风险。

缺点:

1、产品必须有共同点,范围有限制。 
2、如内部变化复杂,会有很多的建造类。

关键代码:

1、建造者(Builder):创建和提供实例
2、指挥者(Director):控制建造过程,隔离用户与建造过程的关联,管理建造出来的实例的依赖关系。

使用场景:

1、需要生成的对象具有复杂的内部结构。 
2、需要生成的对象内部属性本身相互依赖。

实现:

一步一步画小人,首先是头,依次是身体、左手、右手、左脚、右脚。
首先,定义定义一个抽象的造人类:

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.DrawRectangle(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.White );

            PersonThinBuilder ptb = new PersonThinBuilder(pictureBox1.CreateGraphics(), p);
            PersonDirector pdThin = new PersonDirector(ptb);
            pdThin.CreatePerson();

            PersonFatBuilder pfb = new PersonFatBuilder(pictureBox2.CreateGraphics(), p);
            PersonDirector pdFat = new PersonDirector(pfb);
            pdFat.CreatePerson();
        }

显示结果

这里写图片描述
这是一个胖子一个瘦子,如果还想要添加其他的人,就去添加其对应的类。

猜你喜欢

转载自blog.csdn.net/horizon_junmowen/article/details/81223914