前言
这个模式我感觉对于我们大家来说真是的在熟悉不过了,不就是复制啊,在写代码的时候我有的时候就会ctrl+c,ctrl+v,复制的时候挺爽,出错的时候别哭就行,嘻嘻
(如有异同请指出)
内容
定义:用原型实例制定创建对象的种类,并且通过拷贝这些原型创建新的对象
解释:我们通过原型模式可以快速的创建一个对象而不需要提供专门的new()操作就可以快速完成对象的创建,这无疑是一种非常有效的方式,快速的创建一个新的对象,原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。
当我们学习工厂模式和简单工厂等一些模式的时候,我们需要在开头的时候就需要new一个对象而原型设计模式突破了这种繁琐,它不用一点一点的从头开始进行(初始化新对象),直接利用结果就好(动态的获得对象运行时的状态)
例如图:
说简单点其实原型设计模式就是copy出来一个原来对象,就像孙悟空拔下一嘬猴毛,轻轻一吹就会变出好多的孙悟空来。
浅复制与深复制
Object类的clone方法只会拷贝对象中的基本的数据类型,对于数组、容器对象、引用对象等都不会拷贝,这就是浅拷贝。
浅复制其实就是传引用,当copy的时候我们copy的是地址中的内容,当地址中的内容改变,我们随之也改变
实现深拷贝:必须将原型模式中的数组、容器对象、引用对象等另行拷贝
深复制其实就是传引用,当copy的时候我们copy的是值,也就是说当地址中的值改变的时候不会影响到我们原来的值。
在代码中体现浅复制与深复制的区别,通过接口我们可以看出区别
如图
代码
深复制代理类
//简历类
class Resume : ICloneable
{
//定义姓名,性别,年龄,工作经历里面的work,引用工作经历对象
private string name;
private string sex;
private string age;
private WorkExperience work;
//只对工作经历进行copy,在简历类实例化时间时实例化"工作经历"
public Resume(string name)
{
this.name = name;
work = new WorkExperience();
}
//提供Clone方法调用的私有构造函数,以便克隆工作经历的数据
private Resume(WorkExperience work)
{
this.work = (WorkExperience)work.Clone();
}
.
.
.
.
//调用私有的构造方法,让工作经历克隆完成,然后
public object Clone()
{
Resume obj = new Resume(this.work );
obj.name = this.name;
obj.sex = this.sex;
obj.age = this.age;
return obj ;
}
}
//工作经历类实现ICloneable
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
{
//定义姓名,性别,年龄,工作经历里面的work,引用工作经历对象
private string name;
private string sex;
private string age;
private WorkExperience work;
//只对工作经历进行copy,在简历类实例化时间时实例化"工作经历"
public Resume(string name)
{
this.name = name;
work = new WorkExperience();
}
.
.
.
public object Clone()
{
return (object)this.MemberwiseClone();
}
}
//工作经历类
class WorkExperience
{
//定义工作时间字段
private string workDate;
.
.
.
.....