我正在学习原型设计模式,并有一些问题。
我理解原型设计模式用于创建在内存或资源方面成本高昂的对象。在这种情况下,我们使用已经存在的对象的克隆。
那么创建一个new
对象和clone()
有什么区别?对象存储在哪里的内存中?
我正在学习原型设计模式,并有一些问题。
我理解原型设计模式用于创建在内存或资源方面成本高昂的对象。在这种情况下,我们使用已经存在的对象的克隆。
那么创建一个new
对象和clone()
有什么区别?对象存储在哪里的内存中?
clone()
方法只是创建一个新对象并将成员变量值复制到其中。一般来说,它既不比创建新对象更昂贵,也不比创建新对象更便宜。使用clone()
方法比使用new
创建对象更便宜的唯一情况是:当对象的构造函数执行某些昂贵的操作时。例如,如果构造函数接收参数并将其用作数据库查询的一部分,那么在这种情况下使用clone()
会更便宜,因为昂贵的查询操作将不会发生。clone()
方法创建预先准备好的副本。clone()
方法根本不需要任何参数,所以很明显它更简洁。如果你需要多个不同版本的此对象的多个副本,则原型模式变得很有吸引力。原型设计模式是在创建对象占用过多系统资源和性能时使用的,我们恰好在想要拥有许多类实例且这些实例相似时使用此设计模式,因此我们不希望使用例如“new”运算符,因为它会非常昂贵,我们所需的只是基于已创建的第一个对象来实例化这些对象。
优点是新对象将是独立的,并且创建它所需的资源不会像第一个对象那样高昂。 以下是在Java中使用此概念的示例:
import java.util.Vector;
public class Samsung implements Cloneable{
private Vector<String> models;
public Samsung(){
models=new Vector<>();
//we suppose in this comments we access to a data Base to get models
//and then we get a full list of Samsung models
//... and finish
//Sadly we took to much of time to fetch the database
//we don't want to waste our time again because Samsung rarely update its database
models.add("Samsung S1");
models.add("Samsung S2");
models.add("galaxy note");
models.add("galaxy star");
}
public Samsung(Vector<String> models){
this.models=models;
}
public Samsung clone() {
Vector<String> modelsCopy=new Vector<>();
Samsung samsungCopy=null;
//here we don't need to access the database again, we will just copy the previous list
try{
for(String model:this.models){
modelsCopy.add(model);
}
samsungCopy=new Samsung(modelsCopy);
return samsungCopy;
}
catch(Exception e){
return null;
}
}
}
主程序:
public static void main(String[] args) {
Samsung usa_Samsung=new Samsung();
Samsung morocco_Samsung=usa_Samsung.clone();
System.out.println("original = " + usa_Samsung);
System.out.println("copy = " + morocco_Samsung);
}
输出:
original = Samsung@6d06d69c
copy = Samsung@7852e922
就像你看到的,这些对象由于不同而没有相同的地址。
注意!我只是举例使用了“三星”这个名称。