一,理解
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,输出结果: