以下笔记整理自《Java设计模式》刘伟
原理
- 将一个原型对象传给要发动创建的对象,通过请求原型对象拷贝实现创建过程
- 克隆产生的对象是全新的对象,在内存中拥有新的地址,通常对克隆对象的修改不会造成原型对象的变化
包含角色
- 抽象原型类
- 可以是抽象类或接口,也可以是具体实现类
- 具体原型类
- 实现具体的克隆方法,返回自己的一个克隆对象
- 客户类
-只需要直接实例化或通过工厂方法等方式创建原型对象,调用爱方法的克隆方法得到多个相同对象 - (原型管理器)
- 将多个原型对象存储在一个集合中供客户端使用,是一个专门负责克隆对象的工厂
clone方法的注意事项
- 对任何对象x,都有
x.clone()!=x
,克隆对象与原型对象不是同一个对象 - 对任何对象x,
x.clone().getClass()==x.getClass()
,克隆对象与原型对象的类型一致 - 如果对象x的equals方法定义恰当,
x.clone().equals(x)
应该成立
深克隆和浅克隆
浅克隆
- 如果原型对象的成员变量是值类型(
int、float、double、byte、char、short、long、boolean
),直接复制一份呢给克隆对象 - 如果是引用类型(如
String、Integer
等),将引用对象的地址赋值给克隆对象
深克隆
- 无论是值类型还是引用类型,都复制一份给克隆对象
- 可以通过序列化等方式实现深克隆,序列化是将对昂写到流,写到流的对象是原有杜希昂的一个拷贝,源对象仍存在内存中