原型模式——找工作要复印简历

简介: 原型模式——找工作要复印简历

 原型模式(Prototype)定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

 例子背景: 找工作需要准备大量的简历,可是我不想一份一份的码字,于是想起了复制粘贴功能。朋友也托我帮他做简历,格式可以全完复制粘贴,要想让简历内容不一样,就需要用到深复制功能,这里用显示不同工作经历举例。

 复制功能还有浅复制、深复制的区别。

原型类:.net提供了ICloneable接口,其中就有方法Clone(),所以其实不必写原型类,实现接口即可。

abstract class Prototype
{
  private string id;    
  public Prototype(string id)   //构造函数重载
  {
    this.id=id;
  }
  public string Id    //Id属性只读
  {
    get {return id;}
  }
  public abstract Prototype Clone(); //抽象类的Clone方法
}

具体原型类:

//具体原型类实现复制
class ConcretePrototype1:Prototype
{
  public ConcretePrototype1(string id):base(id)
  {}
  public override Prototype Clone() //重写Clone方法
  {
    return (Prototype)this.MemberwiseClone(); //MemberwiseClone()就是浅复制
  }
}

客户端代码:

static void Main (string[] args)
{
  ConcretePrototype1 p1 = new ConcretePrototype1("I");
  ConcretePrototype1 c1 = (ConcretePrototype1)p1.Clone(); //把Clone后的值强转成ConcretePrototype1类型
  Console.WriteLine("Clone:{0}",c1.Id);
  Console.Read();
}

  浅复制: MemberwiseClone()方法,当字段是值类型,则逐位复制;当字段是引用类型,则复制引用,不复制引用的对象。

工作经历类:

    class WorkExperience
    {
        private string workDate;     //工作时间
        public string WorkDate
        {
            get { return workDate; }
            set { workDate = value; }
        }
        private string company;   //所在公司
        public string Company
        {
            get { return company; }
            set { company = value; }
        }

简历类:

class Resume:ICloneable   //实现接口
    {
        private string name, sex, age;
        private WorkExperience work; //引用工作经历对象
        public Resume(string name)
        {
            this.name = name;
            work = new WorkExperience(); //在简历类实例化同时实例化工作经历
        }
        //设置个人信息
        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()
        {
            return (Object)this.MemberwiseClone();    //这里用到浅复制方法了
        }

客户端:

    static void Main(string[] args)
        {
            Resume a = new Resume("飞机");
            a.SetPersonalInfo("男","29");
            a.SetWorkExperience("2020年11月29日","九天星月公司");
            Resume b = (Resume)a.Clone(); //a的值浅复制给了b
            b.SetWorkExperience("2020年11月29日","米西我的超人公司");   //引用被覆盖
            Resume c = (Resume)a.Clone(); //a的值浅复制给了c
            c.SetPersonalInfo("男","24");  //重新复制
            c.SetWorkExperience("2020年11月30日","瓜里瓜气公司");  //引用被覆盖
            a.Display();
            b.Display();
            c.Display();
            Console.Read();
        }

显示:显示的工作经历都是最后一次的值

飞机 男 29
工作经历:2020年11月30日 瓜里瓜气公司
飞机 男 29
工作经历:2020年11月30日 瓜里瓜气公司
飞机 男 24
工作经历:2020年11月30日 瓜里瓜气公司

  深复制: 把引用的对象的变量指向复制过的新对象,而不是原有的引用对象。


工作经历类:

class WorkExperience:ICloneable //实现了接口
{
  省略……
}
public Object Clone() //实现克隆方法
{
  return (object)this.MemberwiseClone();  //依然是MemberwiseClone(),但简历类里传值方式会有改变
}

简历类:

class Resume:ICloneable   //实现接口
    {
        private string name, sex, age;
        private WorkExperience work; //引用工作经历对象
        public Resume(string name)
        {
            this.name = name;
            work = new WorkExperience(); //在简历类实例化同时实例化工作经历
        }
        private Resume(WorkExperience work)//构造函数,参数是工作经历类型
        {
            this.work = (WorkExperience)work.Clone(); //这里的Clone()方法是工作经历类里的方法,浅复制了引用
        }
        //设置个人信息
        public void SetPersonalInfo(string sex,string age)
        {
            不变,省略……
        } 
        //设置工作经历
        public void SetWorkExperience(string workDate, string company)
        {
      不变,省略……
        }
        //显示
        public void Display()
        {
            不变,省略……
        }
        public Object Clone()
        {
          //使用构造方法,让工作经历浅复制完成,赋值给新对象,而不是原来被引用的对象
            Resume obj = new Resume(this.work); 
            obj.name = this.name;
            obj.sex = this.name;
            obj.age = this.age;
            return obj;
        }

客户端代码不变。

显示:这次三次工作经历都不相同。

飞机 男 29
工作经历:2020年11月29日 九天星月公司
飞机 大鸟 29
工作经历:2020年11月29日 米西我的超人公司
飞机 男 24
工作经历:2020年11月30日 瓜里瓜气公司
目录
打赏
0
0
0
0
5
分享
相关文章
怎样写出让面试官眼前一亮的简历
怎样写出让面试官眼前一亮的简历
186 0
简历面试 | #不会讲故事#的人到底有多吃亏#
职场中很多人都是做事靠谱,表达翻车,明明做了80分,却连60分都讲不出来,真的非常吃亏。尤其在写简历和面试场景,面试官很难通过实实在在的相处和观察,得知你究竟工作结果如何,只能通过文字和语言描述判断你的能力。这篇文章会具体讲一讲,如何描述自己的经历会更有说服力。
简历面试 | 不会讲故事的人到底有多吃亏
职场中很多人都是做事靠谱,表达翻车,明明做了80分,却连60分都讲不出来,真的非常吃亏。尤其在写简历和面试场景,面试官很难通过实实在在的相处和观察,得知你究竟工作结果如何,只能通过文字和语言描述判断你的能力。这篇文章会具体讲一讲,如何描述自己的经历会更有说服力。
84677 23
简历面试 | 不会讲故事的人到底有多吃亏
双非硕士的辛酸求职回忆录:第 1 篇 一份让面试官满意的简历究竟要做到什么
双非硕士的辛酸求职回忆录:第 1 篇 一份让面试官满意的简历究竟要做到什么
211 0
双非硕士的辛酸求职回忆录:第 1 篇 一份让面试官满意的简历究竟要做到什么
名企献身说法:我们喜欢这样的简历
校园招聘的企业一般都要求应聘者先发电子简历,他们往往先通过简历对应聘者进行初步的筛选。那么如何才能写一份好简历,让自己从千百份简历中脱颖而出呢?   一、内容必须真实   IBM中国区人力资源总监白文杰强调,不管是你的知识水平、业务能力,还是你的工作经历,不管是简历的哪个环节,哪怕是一个细小的部分,在书写这些东西时,都要遵循真实的原则,并要执行好“真实”这个原则。
1116 0
【书评】《你好哇,程序员——漫话程序员面试求职、升职加薪、创业与生活》
做为一个大龄的十年加工作经验的长像酷似猿的老程序猿,有着对程序员这一职业不一般的情感;这本由 安晓辉 写的《你好哇,程序员——漫话程序员面试求职、升职加薪、创业与生活》让我觉得不可不看;前段时间有样章可以试读,我写了一篇试读的文章,现在整本读完了,再来写一写。
1083 0
实习生面试随手记
2017年6月2号,今天上下午都有面试。 上午面试是北京全路通信信号研究设计院,是一家央企,面试的工作是软件开发。面试方式是多对一面试(HR+4个面试官)。面试过程,相当尴尬,因为我本人的方向是做光通信领域的,对软件开发接触属于理论上的,很显然和他们的要求不对口,主要问题: 1、自我介绍,主要介绍项目。
2402 0

热门文章

最新文章

相关实验场景

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等