目录
定义:
使用原型实例指定待创建对象类型,并且通过复制这个圆形来创建新的对象
UML图:
Prototype(抽象原型类)
ConcretePrototype(具体原型类)
Client(客户类)
浅克隆:
当原型对象被复制时,只复制它本身和其中包含值类型的变量而引用类型的成员变量
并没有被复制
深克隆:
除对象本身被复制外,对象所包含的所有成员变量也将被复制
克隆代码实现:
public interface Prototype {
public Prototype clone();
}
public class ConcretePrototype implements Prototype {
private String attr;
public void setAttr(String attr) {
this.attr = attr;
}
public String getAttr() {
return this.attr;
}
//克隆方法
public Prototype clone() {
ConcretePrototype prototype = new ConcretePrototype(); //创建新对象
prototype.setAttr(this.attr);
return prototype;
}
}
……
ConcretePrototype prototype = new ConcretePrototype();
prototype.setAttr("Allen");
ConcretePrototype copy = (ConcretePrototype)prototype.clone();
……
实例:
在使用某OA系统时,有些岗位的员工发现他们每周的工作都大同小异,因此在填写工作周报时很多内容都是重复的。为了提高工作周报的创建效率,大家迫切希望有一种机制能够快速创建相同或者相似的周报,包括创建周报的附件。 试使用原型模式对该OA系统中的工作周报创建模块进行改进。
这里我们实现cloneable接口,我们实现的是浅克隆。
深克隆
原型模式优点:
- 简化对象的创建过程,通过复制一个已有实例可以提高新实例的创建效率
- 扩展性较好
- 提供了简单的创建结构,原型模式中产品的复制是通过封装在原型类中的克隆方法实现的,无须专门的工厂类来创建产品
- 可以使用深克隆的方式保存对象的状态,以便在需要的时候使用,可辅助实现撤销操作
原型模式缺点:
- 需要为每一个类配备一个克隆方法,而且该克隆方法位于一个类的内部,当对已有的类进行改造时,需要修改源代码,违背了开闭原则
- 在实现深克隆时需要编写较为复杂的代码,而且当对象之间存在多重的嵌套引用时,为了实现深克隆,每一层对象对应的类都必须支持深克隆,实现起来可能会比较麻烦