Java设计模式---原型模式

Java设计模式---原型模式,第1张

说白了就是以一个对象为原型,然后克隆出另外一个对象,用来提高程序效率。

一、浅克隆

①创建一个类实现Cloneable接口,并重写clone方法


public class Video implements Cloneable {
    private String name;
    private Date createTime;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    public Video(String name, Date createTime) {
        this.name = name;
        this.createTime = createTime;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    @Override
    public String toString() {
        return "Video{" +
                "name='" + name + '\'' +
                ", createTime=" + createTime +
                '}';
    }
}

②测试

public class Test {
    public static void main(String[] args) throws CloneNotSupportedException {
        //创建一个对象
        Video v1 = new Video("正在提升", new Date());
        System.out.println("v1:"+v1);
        System.out.println("v1.hash:"+v1.hashCode());

        
        //通过v1克隆v2
        Video v2 = (Video) v1.clone();
        System.out.println("v2:"+v2);
        System.out.println("v2.hash:"+v2.hashCode());
    }
}

//打印出来的结果
//v1:Video{name='正在提升', createTime=Fri May 06 11:05:04 CST 2022}
//v1.hash:1735600054
//v2:Video{name='正在提升', createTime=Fri May 06 11:05:04 CST 2022}
//v2.hash:21685669

会发现v2确实克隆了v1,但是他们又是两个不同的对象。

但会存在一个问题,就是它们使用的是同一个Date对象。所以一个对象中的date改变了那么另外一个对象中的date会跟着改变

这种克隆方式属于浅克隆。

二、深度克隆

方式一:可以使用序列化和反序列化。
方式二:修改一下clone方法

①创建一个对象实现Cloneable接口并重写clone方法



public class Video implements Cloneable{

    private String name;
    private Date createDate;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Object obj = super.clone();
        Video v = (Video)obj;
        v.createDate=(Date) this.createDate.clone();
        return obj;
    }

    public Video(String name, Date date) {
        this.name = name;
        this.createDate = date;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getDate() {
        return createDate;
    }

    public void setDate(Date date) {
        this.createDate = date;
    }

    @Override
    public String toString() {
        return "Video{" +
                "name='" + name + '\'' +
                ", createDate=" + createDate +
                '}';
    }
}

②测试


public class Test {
    public static void main(String[] args) throws CloneNotSupportedException {
        Date date = new Date();
        Video v1 = new Video("正在提升", date);
        Video v2 = (Video)v1.clone();
        System.out.println("v1:"+v1);
        System.out.println("v2:"+v2);

        System.out.println("========修改时间=======");

        date.setTime(565656566);
        System.out.println("v1:"+v1);
        System.out.println("v2:"+v2);
    }
}

//打印结果
//
//v1:Video{name='正在提升', createDate=Fri May 06 11:56:11 CST 2022}
//v2:Video{name='正在提升', createDate=Fri May 06 11:56:11 CST 2022}
//========修改时间=======
//v1:Video{name='正在提升', createDate=Wed Jan 07 21:07:36 CST 1970}
//v2:Video{name='正在提升', createDate=Fri May 06 11:56:11 CST 2022}

会发现,这种方式就实现了深拷贝。

Spring中的Bean就是使用单列模式,原型模式~

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/871746.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存