原型模式

一,理解

1,书上的说法:

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象

2,自己的理解:

原型模式是实现了一个原型接口,该接口用于创建当前对象的克隆,如果直接创建可能会占用大量的空间,所以用克隆的方法

3,在这之前想对大家说一下有哪些是值类型有哪些是引用

类别描述
值类型基本数据类型

整型:int

长整型:long

浮点型:float;

字符型:char

布尔型:bool

枚举类型枚举:enum
结构类型结构:struct
 
 
引用类型基类:System.Object
字符串:string 
自定义类:class
 
接口接口:interface
数组int[],string[]

二,      用法:

1,什么时候用?

(1)当需要复制的时候由于量比较大,而且都含有相同的部分,但是有部分关键需要修的时使用.

(2)当实例化的类是在运行时刻才指定时

2,如何用?

利用已有的原型模式,快速的生成与原型相同的实例

3,重点是什么?

需要有接口:ICloneable,还要写Clone的方法,如下:

public object Clone ()
        {
            return (object)this.MemberwiseClone();
        }

4,优缺点是什么?

(1)优点:

  • 能够节省空间
  • 不受构造函数的影响

5,浅拷贝和深拷贝

浅拷贝:原始类型为值传递,对象类型仍为引用传递。

深拷贝:深拷贝(对象/数组):所有元素或属性均完全复制,与原对象完全脱离,也就是说所有对于新对象的修改都不会反映到原对象中。

显然,浅拷贝会带来一个很大的问题。如果我复制的值是一个引用地址,那么我通过一个变量去修改这个对象,会导致所有该对象的引用都发生变化。

注意:这样就用到了前面所说的值类型还是引用类型,在运用到克隆的时候会有不同

三,举例:

当一个公司需要录入新的职员的时候,

总共需要四个部分:工作经历,姓名,年龄,性别四种,

由于工作经验当中还包括二个部分,就像工作 几几年到几几年和那家公司,

1,首先由于工作经验中还有嵌套,所以首先要写一个工作经验的类还要实现ICloneable,如下:

class Experience:ICloneable
    {
        private string workData;
        public string WorkData
        {
            get { return workData; }
            set { workData = value; }
        }
        private string company;
        public string Company
        {
            get { return company; }
            set { company = value; }
        }
        public object Clone ()
        {
            return (object)this.MemberwiseClone();
        }
    }

2,写一个简历的类:

class Resume:ICloneable
    {
        private string name;
        private string sex;
        private string age;
        private Experience work;
        public Resume (string name)
        {
            this.name = name;
            work = new Experience();
        }
        private Resume (Experience work)
        {
            this.work = (Experience)work.Clone ();//使用Clone方法调用私有构造方法,以便克隆工作经验
        }

       

        public void SetPersonalinfo(string sex,string age)
        {
            this.sex = sex;
            this.age = age;
        }
        public void SetworkExperience(string workData,string company)
        {
            work.WorkData = workData;
            work.Company = company;
        }
        public void display()
        {
            Console.WriteLine("{0} {1} {2}",name,sex,age);
            Console.WriteLine("工作经历:{0} {1} ",work.WorkData ,work.Company );
        }
        public object Clone ()
        {
            Resume  agj = new Resume (this.work );//调用私有的构造方法,让工作经历的克隆完成,在将个字段进行复制
            agj.name = name;
            agj.sex = sex;
            agj.age = age;
            return agj;
        }
    }

3,最终写客户端:

static void Main(string[] args)
        {
            Resume a = new Resume("翠花");
            a.SetPersonalinfo("女", "43");
            a.SetworkExperience("2000_2002","YY企业");
            Resume B = (Resume)a.Clone ();
            B.SetPersonalinfo("男", "42");
            B.SetworkExperience("2003_2005", "XX企业");
            Resume C = (Resume)a.Clone();
            C.SetPersonalinfo("变态", "35");
            C.SetworkExperience("1998_2008", "WW企业");
            a.display();
            B.display();
            C.display();
            Console.ReadKey();
        }

4,输出结果:

 

评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值