原型模式
定义
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象原型模式是一种创建型设计模式,Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。
浅克隆
对值类型的成员变量进行值的复制,对引用类型的成员变量只复制引用,不复制引用的对象.
深克隆
对值类型的成员变量进行值的复制,对引用类型的成员变量也进行引用对象的复制.
uml
客户(Client)角色:客户端类向原型管理器提出创建对象的请求
抽象原型(Prototype)角色:这是一个抽象角色,通常由一个C#接口或抽象类实现。此角色给出所有的具体原型类所需的接口。在C#中,抽象原型角色通常实现了ICloneable接口。
具体原型(Concrete Prototype)角色:被复制的对象。此角色需要实现抽象的原型角色所要求的接口。
原型管理器(Prototype Manager)角色:创建具体原型类的对象,并记录每一个被创建的对象。
实例与应用
public class Prototype implements Cloneable {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public Object clone(){
try {
return super.clone();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
public class ConcretePrototype extends Prototype {
public ConcretePrototype(String name) {
setName(name);
}
}
public class Test {
public static void main(String[] args) {
Prototype pro = new ConcretePrototype("张三");
Prototype pro2 = (Prototype)pro.clone();
System.out.println(pro.getName());
System.out.println(pro2.getName());
}
}
深克隆
public class Prototype implements Cloneable {
private ArrayList list = new ArrayList();
public Prototype clone(){
Prototype prototype = null;
try{
prototype = (Prototype)super.clone();
prototype.list = (ArrayList) this.list.clone();
}catch(CloneNotSupportedException e){
e.printStackTrace();
}
return prototype;
}
}
优点
1向客户隐藏制造新实例的复杂性
2 提供让客户能够产生未知类型对象的选项。
3某些情况下复制对象比创建对象更有效:使用原型模式创建对象比直接new一个对象在性能上要好的多。使用原型模式的另一个好处是简化对象的创建,使得创建对象像复制粘贴一样简单。
缺点
对象复制有时相当复杂
使用场景
因为以上优点,所以在需要重复地创建相似对象时可以考虑使用原型模式。比如需要在一个循环体内创建对象,假如对象创建过程比较复杂或者循环次数很多的话,使用原型模式不但可以简化创建过程,而且可以使系统的整体性能提高很多。但是使用时应注意引用类型成员变量的复制。使用克隆不会调用对象的构造方法。