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行代码,无师自通,量的改变才能造成质的改变。

  • 相关阅读:
    Cocos2d-x 3.0 beta 中加入附加项目,解决无法打开包括文件:“extensions/ExtensionMacros.h”: No such file or directory”
    C、Shell、Perl基于Tomcat开发CGI程序环境配置
    Windows机器配置启动加载器的高级选项后,机器出现蓝屏,无法RDP
    Linux由于物理节点故障导致的异常重启-Case1
    Azure经典虚拟机(Windows)如何监测单个磁盘的使用空间
    ARM VM安装Linux Diagnostic 2.3扩展
    rsyslog服务日志报错分析1
    登陆Linux服务器时触发邮件提醒
    部署Azure Log Analytics
    获取指定订阅下所有Azure ARM虚拟机配置(CPU核数,内存大小,磁盘信息)的使用情况
  • 原文地址:https://www.cnblogs.com/wang-charle/p/8645615.html
Copyright © 2011-2022 走看看