设计模式(7) 续原型模式

在我们生活中一些事物总有它它特有的属性、像论文、建立、求职信等、都有其固有的格式来书写,下面咱咱用简历来实现咱原型模式的实现。

当咱书写一份简历时,必须要有姓名、可以设计性别、年龄、可以设置工作经历,最终咱们就可以利用这个固定的模式来书写简历。

简历的初步代码实现如下:


图片
图片
这里面客户端用到两份简历、我们需要实例化两次,这样你会不会觉得在客户端很麻烦,假如我们需要二十份简历的话,那我们至少需要实例化29次了啊,这倒不是很严重的,假如我们要将98年改成99年,那我们就要改二十次了,

好到此我们该是原型模式出场的时候了,因为所有的简历的格式是固定的,原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

简单的说原型模式就是从一个对象在创建另外一个可定制的对象,而且不需要知道任何创建的细节,我们来来改改上面的代码

在原型类中:

图片
图片

对于.net而言,那个原型抽象类prototype是用不着的,因为克隆实在是太常用的,所以在.NET中已经提供了一个命名空间在system中icloneable接口,其中就有一个唯一的一个方法clone(),我们在是使用的时候只需要调用接口可以完成原型模式了。

代码更改如下:
图片
图片
图片
这样一改代码就清爽了很多,而且要是想改某份简历,只需要对这份简历做一定的更改就可以了,不会影响到其他的简历,相同的部分就不会再重复了,在性能上也是大大的提高,每当我们new一次,都需要执行一次构造函数,如果构造函数的执行时间很长那么多次的执行这个初始化操做就实在太低效率,一般在初始化的信息不发生变化的情况下,克隆是最好的办法,这既隐藏了对象创建的细节,有对性能是大大的提高。他不等于是不用初始化的对象,而是动态的获得对象运行时的状态。

但是在咱简历中,对象的数据都是string型的,也就是值类型,memberwiseclone()方法是这样,如果字段是值类型的,则对该字段执行逐位复制,如果字段是引用类型,则复制引用但不复制引用的对象,因此,原始对象及其复本引用同一对象,也就是对“简历”类中对象引用,那么引用的对象数据是不会被克隆过来的。

这里面牵扯到一个复制的概念:浅表复制、深层复制

浅表复制:被复制对象的所有变量的都含有与原来的对象相同的值,而所有的对其他对象引用都仍然指向原来的对象,但是我们可能需要这样的一种需求,把复制对象引用的对象都复制一遍,这就应用到了深复制,深复制把引用对象变量指向复制过的新对象,而不是原有的引用的对象,

下面通过一个例子分析出里面的不同:

图片
图片
图片
图片 这种方式我们显示的值为:

图片

这里面我们可以看到在工作经验的时候显示的值都为一致的。因为这里面是值引用,就是说在里面引用的对象都是指向同一个实例。

咱再看另外一个同样的程序:

图片
图片
图片
图片
图片 这个程序实现的结果:

图片

这样就能实现工作经验的复制,因为在工作经验中就又能力的复制。

其实在深层复制我们实现起来是通过序列化来实现的。嘿嘿、写篇日志分析此处

原文地址:https://www.cnblogs.com/zhijianliutang/p/2250605.html