zoukankan      html  css  js  c++  java
  • 大话设计模式学习之建造者模式

    建造者模式(Builder)

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

    UML图

     

    1、首先我们创建一个抽象类Builder,该类主要是为创建一个Product对象的各个部件指定的抽象接口。

    abstract class PersonBuilder

        {

            protected Graphics _g;

            protected Pen _p;

            public PersonBuilder(Graphics g, Pen p)

            {

                this._g = g;

                this._p = p;

            }

            //虚方法 对象的构建方法

            public abstract void BuilderHead();

            public abstract void BuilderBody();

            public abstract void BuilderArmRight();

            public abstract void BuilderArmLeft();

            public abstract void BuilderLegRight();

            public abstract void BuilderLegLeft();

    }

    2、具体创建者类,继承于基类PersonBuilder,实现PersonBuilder接口,构造函数和装配各个部件。

    class PersonThinBuilder:PersonBuilder

        {

            public PersonThinBuilder(Graphics g, Pen p)

                : base(g, p)

            {

            }

            public override void BuilderHead()

            {

                _g.DrawEllipse(_p, 50, 20, 30, 30);

            }

            public override void BuilderBody()

            {

                _g.DrawRectangle(_p, 60, 50, 10, 50);

            }

            public override void BuilderArmLeft()

            {

                _g.DrawLine(_p, 60, 50, 40, 100);

            }

            public override void BuilderArmRight()

            {

                _g.DrawLine(_p, 70, 50, 90, 100);

            }

            public override void BuilderLegLeft()

            {

                _g.DrawLine(_p, 60, 100, 45, 150);

            }

            public override void BuilderLegRight()

            {

                _g.DrawLine(_p, 70, 100, 85, 150);

            }

        }

    class PersonFatBuilder:PersonBuilder

    {

      ………

    }

    3、PersonDirector类为指挥类,该类指挥具体使用哪一个PersonBuilder接口实例化的得到的创建者对象。

      //指挥类(Director),该类主要用来控制建造过程,

      //指示要建造哪个具体的建造对象,也用它来隔离用户与建造过程的关联

    class PersonDirector

        {

            private PersonBuilder _pb;

            public PersonDirector(PersonBuilder pb)

            {

                this._pb = pb;

            }

            //根据用户的选择建造对应的建造者对象

            public void CreatePerson()

            {

                _pb.BuilderHead();

                _pb.BuilderBody();

                _pb.BuilderArmLeft();

                _pb.BuilderArmRight();

                _pb.BuilderLegLeft();

                _pb.BuilderLegRight();

            }

        }

    4、客户端代码实现:

    try

                {

                    Graphics g = pictureBox1.CreateGraphics();//创建了一个画布

                    Pen p = new Pen(Color.Red);

                    //实例化了一个小人建造者对象

                    PersonThinBuilder thinPerson = new PersonThinBuilder(g, p);

                    //传入一个小人建造者对象给建造者对象控制器

                    PersonDirector perDirector = new PersonDirector(thinPerson);

                    //直接调用了产生对象的具体实例方法

                    perDirector.CreatePerson();

                }

                catch (Exception ex)

                {

                   

                    MessageBox.Show(ex.Message);

                }

                MessageBox.Show("小人产生成功");

            }

  • 相关阅读:
    typedef的用法
    重定向在网络编程中的理解
    简答的理解C语言中的各种类型函数
    栈、堆、静态存储区
    标识符起作用范围----作用域、连接类型、存储期
    main函数的argc和argv
    基本数据类型
    数组与指针
    第一章 CLR的执行模型
    Revit 二次开发 沿弧形路径创建拉伸屋顶
  • 原文地址:https://www.cnblogs.com/luodao1991/p/3063107.html
Copyright © 2011-2022 走看看