设计模式-原型模式

原型模式

普通的创建对象时通过类来创建,这种创建对象的方法非常消耗资源。当需要创建大量对象实例的时候,如果一个一个地通过类来创建实例对象,那么无疑时非常耗费时间的。

而原型模式无疑就是一种更好的选择。原型模式就是以一个实例化对象为原型,然后根据这个原型对象直接复制出实例化对象。由于复制是在内存层面进行的,所以速度相比于通过类的构造函数,要快得多。

通过类的构造函数创建对象,就相当于在纸上手写内容,而原型模式创建对象,相当于是将一张写好的纸作为原型直接复印出许多张。

下面是普通的创建对象的方式:

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指向相同的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值