简介
原型模式(Prototype Pattern):使用原型实例指定待创建对象的类型,并通过复制这个原型来创建新的对象。
- 当需要使用相同或者相似对象时,将原型类自身作为工厂,复制新的对象。
结构和实现
- 角色包括:
- 抽象原型类:声明克隆方法的接口,可以使抽象类、接口、具体类。java中通常为Object类。
- 具体原型类:实现克隆方法,返回自身的克隆对象。
- 原型模式结构。
- 实现的clone方法分为浅克隆和深克隆,区别在于是否复制引用类型的成员变量。
浅克隆
- 实现Cloneable接口,重写clone方法,调用父类的clone方法。
@Override
protected Prototype clone() throws CloneNotSupportedException {
return (Prototype) super.clone();
}
深克隆
- 实现 Cloneable, Serializable 接口,重写clone方法,序列化对象之后反序列化。
- 可以使用输入输出流,也可以使用json字符串。
- 成员对象如果是引用类型,也需要实现Serializable接口。
@Override
protected Prototype clone() throws CloneNotSupportedException {
Prototype prototype = null;
try {
//序列化
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(this);
//反序列化
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
prototype = (Prototype) ois.readObject();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
//关闭流
}
return prototype;
}
实例
- 每周的周报大同小异,需要快速复制周报以供修改,包括周报中的附件。
- 工作周报创建结构。
原型管理器
- 将多个原型对象存储在一个集合中,需要对应对象时,克隆出对象。
优缺点和适用范围
- 优点:
- 提高创建对象的效率。特别是对象创建过程较为复杂的时候。
- 扩展性好。客户端可以针对抽象原型类编程。
- 简化创建结构。无须工厂类,通过自身的克隆方法实现。
- 可以保存对象状态。深克隆,可辅助实现撤回操作。
- 缺点:
- 克隆方法需要修改源码。改造已有的类或者修改克隆方法违背开闭原则。
- 深克隆要求嵌套对象支持深克隆。对象的引用类型成员变量也需要支持深克隆。
- 适用环境:
- 创建对象成本较大,操作复杂。
- 系统需要保存对象的状态。
jdk中的应用
- 所有类均继承Object这一父类,浅克隆实现Cloneable接口,深克隆实现 Cloneable, Serializable 接口。