栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

一、浅克隆

①创建一个类实现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就是使用单列模式,原型模式~

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/863154.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号