定义
Prototype Pattern:使用原型实例指定创建对象的数据类型,并且通过克隆(拷贝)这些原型创建新的对象。原型模式是一种对象创建型模式。
原型模式是一种另类的创建型模式,创建克隆对象的工厂就是原型类自身,工厂方法由克隆方法来实现。
需要注意的是,通过克隆方法创建的对象是全新的对象,它们在内存中拥有新的地址;通常,对克隆所产生的对象进行修改不会对原型对象造成任何影响。
UML示例
实现方法
通用实现
在具体原型类的克隆方法中实例化一个与自身类型相同的对象,并将其返回,请将相关的参数传入新创建的对象中,保证它们的成员变量相同。示意代码如下
// Prototype
public interface Prototype {
Prototype clone();
}
// 具体原型类
public class ConcretePrototype implements Prototype{
private String attr;
public String getAttr() {
return attr;
}
public void setAttr(String attr) {
this.attr = attr;
}
public ConcretePrototype clone() {
ConcretePrototype prototype;
prototype = new ConcretePrototype();
prototype.setAttr(this.attr);
return prototype;
}
}
Java提供的clone方法
public class WeekLog implements Cloneable{
public WeekLog clone(){
Object obj = null;
try{
obj = super.clone(); // 父类的克隆方法
return (WeekLog)obj;
}
catch (CloneNotSupportedException e ){
System.out.println("不支持复制");
return null;
}
}
}
浅克隆和深克隆
浅克隆和深克隆的主要区别在于是否支持引用类型的成员变量的拷贝。
浅克隆
在浅克隆中,如果对象的成员变量是值类型,那么将完整复制一份给克隆对象;如果对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象共享同一个成员变量的地址空间。
在Java中的Object的clone方法实现的是浅克隆。
深克隆
在深克隆中,无论原型对象的成员变量是值类型还是引用类型,都将复制一份给克隆对象。
在Java中要实现深克隆主要通过序列化方式实现(通用克隆方法也可)。