原型模式
普通的创建对象时通过类来创建,这种创建对象的方法非常消耗资源。当需要创建大量对象实例的时候,如果一个一个地通过类来创建实例对象,那么无疑时非常耗费时间的。
而原型模式无疑就是一种更好的选择。原型模式就是以一个实例化对象为原型,然后根据这个原型对象直接复制出实例化对象。由于复制是在内存层面进行的,所以速度相比于通过类的构造函数,要快得多。
通过类的构造函数创建对象,就相当于在纸上手写内容,而原型模式创建对象,相当于是将一张写好的纸作为原型直接复印出许多张。
下面是普通的创建对象的方式:
public class Myclass { ... }
public class client {
public static void main(){
List<Myclass> mclist = new ArrayList<Myclass>();
for(int i=0;i<500;i++){
Myclass mc = new Myclass();
mclist.add(mc);
}
}
}
这种方式创建大量对象,每创建一个都会调用类的构造函数,非常耗费时间。
下面是原型模式创建对象的方式:
public class Myclass implements Cloneable {
...
public Myclass clone() throws CloneNotSupportedException {
return (Myclass)super.clone();
}
}
public class MyclassFactory {
private static Myclass prototype = new Myclass(); //先用饿汉模式创建一个原型对象
public static Myclass getInstance(){
Myclass clone = prototype.clone();
return clone;
}
}
注意!!!如果是一个比较复杂的类,那么这样写就会有问题,比如类的属性里面有引用类型。(深复制vs浅复制)
应该重写clone方法,使之成为深复制,如下:
public class Myclass1 implements Cloneable { ... }
public class MyClass implements Cloneable {
private Myclass1 mc1; //成员变量当中有个引用类型
...
public void setMyclass1(Myclass1 mc1){
...
}
protected Myclass clone() throws CloneNotSupportedException {
Myclass clone = (Myclass)supper.clone();
clone.setMyclass1(this.mc1.clone()); //需要对mc1进行深复制
return clone;
}
}
public class MyclassFactory {
private static Myclass prototype = new Myclass(); //先用饿汉模式创建一个原型对象
public static Myclass getInstance(){
Myclass clone = prototype.clone();
return clone;
}
}
如果不重写clone方法,而是直接调用object的clone方法的话,只会进行浅复制,mc1指向相同的内容。