原型模式
定义
- 指原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
- 不需要知道任何细节
- 类型:创建型
使用场景
- 类初始化消耗较多资源
- new产生的一个对象需要非常繁琐的过程(数据准备、访问权限等)
- 构造函数比较复杂
- 循环体中生产大量对象时
优点
- 原型模式创建对象性能比new一个对象性能高
- 简化创建过程
缺点
- 必须配备克隆过程
- 对克隆复杂对象或克隆出的对象进行复杂改造时,容易引入风险
- 深拷贝、浅拷贝要运用得当
源码解析
public interface Cloneable {
}
Cloneable接口,就是原型模式的关键。在原型模式中,要特别注意区分:深克隆和浅克隆
浅克隆
public Object clone(){
return super.clone();
}
浅克隆,不能克隆引用类型对象。和源对象持有相同引用
深克隆
public CacheKey clone() throws CloneNotSupportedException {
CacheKey clonedCacheKey = (CacheKey) super.clone();
clonedCacheKey.updateList = new ArrayList<Object>(updateList);
return clonedCacheKey;
}
深克隆,可以克隆引用类型对象。和源对象持有不同的引用
原型模式破坏单例模式
原型模式和单例模式,其实原型模式的clone()方法可以破坏单例模式(前提要单例类实现Cloneable接口)
源码剖析
可以自行去IDE那看看,那些类实现了Cloneable接口,基本的类有:
ArrayList;HashMap;MyBatis的CacheKey等等。
代码都挺容易看懂的。
网友评论