原型模式是一种对象创建型模式,它的工作原理很简单:将一个原型对象传给要发动创建的对象(客户端对象),这个要发动创建的对象通过请求原型对象复制自己来实现创建过程(也称为克隆对象)。通过克隆方法所创建的对象是全新的对象,它们在内存中拥有新的地址,通常对克隆所产生的对象进行修改不会对原型对象造成任何影响,每一个克隆对象都是相互独立的。
在复制原型对象的同时是否复制包含在原型对象中引用类型的成员变量,原型模式的克隆机制分为两种,即浅克隆和深克隆。
1.浅克隆:在浅克隆中,当原型对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员变量并没有复制,只是复制了引用对象的地址。
2.深克隆:除了对象本身被复制外,对象所包含的所有成员变量也将被复制。
原型模式的结构与实现:
1.Prototype(抽象原型类):它是声明克隆方法的接口,是所有具体原型类的公共父类,它可以是抽象类也可以是接口或者具体类。
public abstract class Prototype {,
public abstract Prototype clone();
}
2.ConcretePrototype(具体原型类):它实现在抽象原型类中声明的克隆方法,在克隆方法中返回自己的一个克隆对象。
public class ConcretePrototype extends Prototype {
private String str;
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
@Override
public Prototype clone() {
ConcretePrototype prototype=new ConcretePrototype();
prototype.setStr(this.str);
return prototype;
}
}
3.Client(客户类):在客户类中,让一个原型对象克隆自身从而创建一个新的对象,由于客户类针对抽象原型类Prototype编程,因此用户可以根据需要选择具体原型类。
public class Client {
public static void main(String[] args) {
ConcretePrototype prototype=new ConcretePrototype();
prototype.setStr("Str");
ConcretePrototype copyPrototype=(ConcretePrototype) prototype.clone();
System.out.println(prototype==copyPrototype);
}
}
Java中的clone()方法和Cloneable接口:在java中所有类的父类Object类提供了一个clone()方法,可以将一个对象复制一份,但只是实现了对象的浅克隆。
public class ConcretePrototypeB implements Cloneable {
public Prototype clone() {
Object object = null;
try {
object = super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return (Prototype) object;
}
}
网友评论