这个模式我感觉对于我们大家来说真是的在熟悉不过了,不就是复制啊,在写代码的时候我有的时候就会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; . . . .....新闻热点
疑难解答