原型模式源码解析

我们看一下Object这个对象,我们直接看一下克隆这个方法protected native Object clone() throws CloneNotSupportedException;很明显看出来,他是一个native的方法,接下来我们再看一个,Cloneable这个接口,public interface Cloneable,只要看看哪些类实现这个接口呢,就知道了这个原型模式,是如何使用的,我们按一下Ctrl+T,这里面有一个定位,直接点一下,会在下边显示出来,这里面开始搜索,在搜索的时候呢,我们再看一个类,ArrayList,相信这个类大家都是知道的,public class ArrayList extends AbstractListimplements List, RandomAccess, Cloneable, java.io.Serializable他实现了Cloneable这个接口,我们看一下它是如何重写的呢,public Object clone() {try {ArrayList v = (ArrayList) super.clone();v.elementData = Arrays.copyOf(elementData, size);v.modCount = 0;return v;} catch (CloneNotSupportedException e) {// this shouldn't happen, since we are Cloneablethrow new InternalError(e);}
}通过Arrays.copyOf这个方法把这里面的元素,copy了一份,同理HashMap这里面public class HashMap extends AbstractMapimplements Map, Cloneable, Serializable是一样的,他也实现了Cloneable这个接口,同时他也重写了克隆这个方法@SuppressWarnings("unchecked")
@Override
public Object clone() {HashMap result;try {result = (HashMap)super.clone();} catch (CloneNotSupportedException e) {// this shouldn't happen, since we are Cloneablethrow new InternalError(e);}result.reinitialize();result.putMapEntries(this, false);return result;
}// These methods are also used when serializing HashSets
final float loadFactor() { return loadFactor; }
final int capacity() {return (table != null) ? table.length :(threshold > 0) ? threshold :DEFAULT_INITIAL_CAPACITY;
}有兴趣的可以来看一下,那在这里想说一下,就是对于原型模式,我们平时在使用的时候,一定要检对象是否和预期是一致的,也就是说这个对象,是新创建出来的呢,还是只是创建一个引用,指向的是同一个地址,也就是说要把深克隆和浅克隆一定要应用好,我们看一下下面搜索出来的都是实现了Cloneable这个接口的实现类,这里又很多,这个是JDK的

包括redission,还有redis的client,还有Spring里面的mybatis,这里面都是实现了Cloneable接口,我们看一下Cache,CacheKey,这个类也实现了Cloneable,public class CacheKey implements CloneableCacheKey是Mybatis里面关于Cache使用的一个类,我们看一下它是如何重写的@Overridepublic CacheKey clone() throws CloneNotSupportedException {CacheKey clonedCacheKey = (CacheKey) super.clone();clonedCacheKey.updateList = new ArrayList(updateList);return clonedCacheKey;}这里面可以看到,首先是super.clone(),然后强转一个新的出来,然后把里面的List赋值成一个新的List,并把这个元素放到新的List里面,进行返回,这样就保证了ArrayList,是一个新创建的ArrayList,但是注意里面的updateListprivate List updateList;这个又是一个List,有兴趣的,建议可以试一下,克隆出来的里面的,这个元素,是相同的对象还是不同的对象,非常你们能够操作一下,你可以模拟CacheKey来写一个类,主要是List,然后再进一步的说,如果List里面包装的,不是String,而是Date对象,我们再看一下效果,希望能够动起手来,那接着看,下面这些是实现Cloneable接口的,包括在开源框架中,会有很多,有兴趣的可以自己挨个看一下,这里面还是挺有意思的,那原型模式在开源框架中,使用的非常广泛,就拿CacheKey来说,这里面也是非常注重克隆出来的对象,引用问题,所以我们在实现原型模式的时候,这一点是一定一定要注意的,如果听到我重复过的,这里一定是重点,包括像前面所讲的,工厂方法和抽象工厂,产品族和产品等级结构,这个是一定要牢牢理解的,而且这个问题打个比方,会经常问,工厂方法和抽象工厂最大的区别是什么,所以碰到这种强调的重点,你们一定要加深理解,那原型模式就讲到这里,希望你们能理解透,能运用好,避免进坑 

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章