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

    这两天事太多了,没来的及更新。今天早点更新。

    今天扯建造者模式。大家都知道一个对象的生成是有过程的。表面上我们看的是New,其实编译器是有一定细节指令代码的。比如我们建房子,需要挖地基,砌墙,上顶等。这些操作步骤不需要我们动手,交给泥瓦工就行了。我们提供的只是,这个宅基地地方,材料等而已。

    2.引用类型在传递过程中传的是引用,其托管堆中的数据可以进程共享。

    3.设计模式之类的东西就是让思路与实现分离。

    原来C语言面向过程的结构化程序一层一层的剥离封装变成面向对象的程序。

    直接用例子说明,继续上别人的代码(备注:研究学习用,所有权归原作者),我来解释:

    //这个类是对应设计师,只设计规划,不去做具体的实施过程。

    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 PersonFatBuilder : PersonBuilder
    {
    public PersonFatBuilder(Graphics g, Pen p)
    : base(g, p)
    { }

    //具体实施设计师的步骤

    public override void BuildHead()
    {
    g.DrawEllipse(p, 50, 20, 30, 30);
    }

    public override void BuildBody()
    {
    g.DrawEllipse(p, 45, 50, 40, 50);
    }

    public override void BuildArmLeft()
    {
    g.DrawLine(p, 50, 50, 30, 100);
    }

    public override void BuildArmRight()
    {
    g.DrawLine(p, 80, 50, 100, 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(string type, Graphics g, Pen p)
    {
    string assemblyName="建造者模式";
    object[] args = new object[2];
    args[0] = g;
    args[1] = p;

    //雇主想让建造什么类型的房子,我都有对应的人手

    this.pb = (PersonBuilder)Assembly.Load(assemblyName).CreateInstance(assemblyName+".Person" + type + "Builder", false, BindingFlags.Default, null, args, null, null);
    }

    //包工头不干活,只让泥瓦工具体实施

    public void CreatePerson()
    {
    pb.BuildHead();
    pb.BuildBody();
    pb.BuildArmLeft();
    pb.BuildArmRight();
    pb.BuildLegLeft();
    pb.BuildLegRight();
    }
    }

    //雇主买需要的材料

    Pen p = new Pen(Color.Yellow);

    //雇主决定建造什么类型的房子
    PersonDirector pdThin = new PersonDirector("Thin",pictureBox1.CreateGraphics(),p);
    pdThin.CreatePerson();

    PersonDirector pdFat = new PersonDirector("Fat", pictureBox2.CreateGraphics(), p);
    pdFat.CreatePerson();

    继续总结:设计模式这些东西都是理论上的,说的再多,具体项目中用的少,照样记不住,想不到。

    设计模式对应一类问题的解决方案,可以认为是前人留下的经验。

    还想再说一遍:C#中的引用类型就相当于指针变量。ref 引用类型 相当于指针的指针变量。

    不扯了,学编程没有捷径,写上10W行代码,无师自通,量的改变才能造成质的改变。

  • 相关阅读:
    命名规范
    操作文件和目录
    使用本地shadow socks代理
    发送邮件
    sql参数化
    定义常量
    获取嵌套字典值的方法
    通过字符串调用函数
    用字典优化过长的if 语句
    操作文件和目录
  • 原文地址:https://www.cnblogs.com/wang-charle/p/8645615.html
Copyright © 2011-2022 走看看