zoukankan      html  css  js  c++  java
  • 设计模式漫谈之原型模式

    继续唠叨,我写这个系列,好像写流水账或小说一样。今天有点忙,有点累,让我静下来的就是在电脑旁看代码。

    Fuck,坏心情!妈的,我31了,每天起床,上班,下班,看代码,与自己对话,孤独的只剩下灵魂和思想了。想想别人开房是和女朋友,我去开房是带着电脑写代码!日!我就是个疯子!不扯了,日子还要过,我还需要积极上进!(请原谅我的激进及愤世嫉俗!)

    今天说原型模式。原型在JS语言中是个很重要很难理解的东西。其实归根到底不好理解的就是指针(定义一个变量,编译器知道变量的地址,妈的我是程序员竟然不知道,好吧,再定义一个变量,专一存这个变量的地址)。在面向对象中,把地址放到了栈中,堆中才有对象。这是理解JS中原型的基础。

    我们来扯面向对象中的原型:

    首先一个对象是有很多成员组成的(静态的,动态的【字段,属性,方法了,事件等】),原型模式也是创建型模式。大家都知道开始学面向对象的时候,类相当于一个磨具,对象是用这个磨具生成的实在的东西。原型相当于类(类某种意义上也是对象,因为也要占空间),创建对象,最方面的就是先复制出来一个,再修修改改。

    2:再说拷贝,分为浅拷贝,和深拷贝,但是要记住不管是浅或深,都是对成员来说的,即拷贝的是成员。

    浅拷贝,意思是拷贝成员的时候,如果成员是引用类型,只把引用拷贝一份,其引用的堆地址共享。深拷贝意思是对引用类型来说,拷贝栈中的引用,同时把堆中的数据也拷贝一份新开辟一个空间(既然开辟新的内存,其栈中的地址肯定要变的)。【备注:字符串虽然是引用类型,但是当值类型使用】

    开始上例子了【一样是别人的例子,我来解释:(备注归我所有,源码归原作者所有)】

    //实现拷贝接口,这个接口只是定义一个可以快速创造另外对象的方法,至于是深拷贝,还是浅拷贝,没有具体说。看实现

    class WorkExperience : ICloneable
    {

    //都是字符串类型的对象,做值类型运算,
    private string workDate;
    public string WorkDate
    {
    get { return workDate; }
    set { workDate = value; }
    }
    private string company;
    public string Company
    {
    get { return company; }
    set { company = value; }
    }

    public Object Clone()
    {

    //此基类的拷贝方法只是浅拷贝,如果里面再有非字符串的引用类型,其所有对象公用内存空间数据
    return (Object)this.MemberwiseClone();
    }
    }

     //一样实现拷贝接口

    class Resume : ICloneable
    {
    private string name;
    private string sex;
    private string age;

    //这是一个非字符串的引用类型

    private WorkExperience work;

    public Resume(string name)
    {
    this.name = name;
    work = new WorkExperience();
    }

    private Resume(WorkExperience work)
    {
    this.work = (WorkExperience)work.Clone();
    }


    public void SetPersonalInfo(string sex, string age)
    {
    this.sex = sex;
    this.age = age;
    }

    public void SetWorkExperience(string workDate, string company)
    {
    work.WorkDate = workDate;
    work.Company = company;
    }


    public void Display()
    {
    Console.WriteLine("{0} {1} {2}", name, sex, age);
    Console.WriteLine("工作经历:{0} {1}", work.WorkDate, work.Company);
    }

    //此处实现的时深拷贝

    public Object Clone()
    {

    //new 的时新实例(实例包括堆,和栈的数据,对象只是堆的数据)
    Resume obj = new Resume(this.work);

    obj.name = this.name;
    obj.sex = this.sex;
    obj.age = this.age;


    return obj;
    }

    }

    Resume a = new Resume("大鸟");
    a.SetPersonalInfo("男", "29");
    a.SetWorkExperience("1998-2000", "XX公司");

    Resume b = (Resume)a.Clone();
    b.SetWorkExperience("1998-2006", "YY企业");

    Resume c = (Resume)a.Clone();
    c.SetWorkExperience("1998-2003", "ZZ企业");

    a.Display();
    b.Display();
    c.Display();

    总结:玩面向对象的东西就是玩堆和栈的。玩C就是玩指针的。玩哲学就是玩时间,空间的。

    不扯了,我的解释是我工作经验编程思想的反馈

  • 相关阅读:
    不为人知easy-mock-cli
    javascript设计模式之适配器模式
    js --装饰者模式
    使用策略模式封装拦截器
    js --桥接模式
    深入理解面向对象 -- 基于 JavaScript 实现
    设计模式 -- 观察者模式
    敏捷开发
    从技术走向管理
    Vue Cli安装以及使用
  • 原文地址:https://www.cnblogs.com/wang-charle/p/8653281.html
Copyright © 2011-2022 走看看