原型模式

原型模式

克隆,Cloneable,clone()

浅克隆

原型类

/*
* 原型类
* 1.实现Cloneable
* 2.重写clone方法
* */
public class Video implements Cloneable{
    private String name;
    private Date createTime;

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

    public Video() {
    }

    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 +
                '}';
    }
}

测试

/*
 * 浅克隆
 * 1.对象内容一样
 * 2.hash不一样,不是同一个对象
 * */
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 + " hash" + v1.hashCode());
        System.out.println(v2 + " hash" + v2.hashCode());

        date.setTime(2633333);

        System.out.println("=======原型的date改变后======");
        //发行v1的date改变后,v2的date也改变了,浅克隆
        System.out.println(v1 + " hash" + v1.hashCode());
        System.out.println(v2 + " hash" + v2.hashCode());
        /*
        * Video{name='黑客帝国', createTime=Mon Dec 13 14:51:33 CST 2021} hash1735600054
        * Video{name='黑客帝国', createTime=Mon Dec 13 14:51:33 CST 2021} hash21685669
        * =======原型的date改变后======
        * Video{name='黑客帝国', createTime=Thu Jan 01 08:00:26 CST 1970} hash1735600054
        * Video{name='黑客帝国', createTime=Mon Dec 13 14:51:33 CST 2021} hash21685669
        * */
    }
}
深克隆方式1

对象的每一个属性都要克隆

原型类

/*
 * 原型类
 * 1.实现Cloneable
 * 2.重写clone方法,自定义克隆代码
 * */
public class Video implements Cloneable {
    private String name;
    private Date createTime;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Object obj = super.clone();
        Video video = (Video) obj;
        //对象属性也进行克隆
        Date date = (Date) this.createTime.clone();
        video.setCreateTime(date);
        return obj;
    }

    public Video() {
    }

    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 +
                '}';
    }
}

测试

/*
 * 深克隆 方法1
 * */
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 + " hash" + v1.hashCode());
        System.out.println(v2 + " hash" + v2.hashCode());

        date.setTime(2633333);

        System.out.println("=======原型的date改变后======");
        //达到预期结果,原型属性改变不在影响克隆对象
        System.out.println(v1 + " hash" + v1.hashCode());
        System.out.println(v2 + " hash" + v2.hashCode());
        /*
            Video{name='黑客帝国', createTime=Mon Dec 13 15:03:15 CST 2021} hash1735600054
            Video{name='黑客帝国', createTime=Mon Dec 13 15:03:15 CST 2021} hash21685669
            =======原型的date改变后======
            Video{name='黑客帝国', createTime=Thu Jan 01 08:43:53 CST 1970} hash1735600054
            Video{name='黑客帝国', createTime=Mon Dec 13 15:03:15 CST 2021} hash21685669
         * */
    }
}
深克隆方式2

实现Serializable接口,通过对象的序列化和反序列化实现克隆

原型类

/*
 * 原型类
 * 1.实现Cloneable
 * 2.重写clone方法,自定义克隆代码
 * */
public class Video implements Serializable {
    private String name;
    private Date createTime;

    public Video() {
    }

    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 CloneUtil {
    //克隆方法:序列化和反序列化
    public static Object clone(Object o) throws Exception {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(o);//把要克隆的对象写进流

        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bais);

        return ois.readObject();
    }
}

测试

/*
 * 深克隆方法2:序列化,反序列化,原型实现Serializable
 * */
public class Test {
    public static void main(String[] args) throws Exception {
        Date date = new Date();
        Video v1 = new Video("黑客帝国", date);
        Video v2 = (Video) CloneUtil.clone(v1);
        System.out.println(v1);
        System.out.println(v2);
        date.setTime(2326262);
        System.out.println("=======v1属性date改变后=======");
        //克隆的对象不随原型对象改变而改变
        System.out.println(v1);
        System.out.println(v2);

        /*
        * Video{name='黑客帝国', createTime=Mon Dec 13 16:02:32 CST 2021}
        * Video{name='黑客帝国', createTime=Mon Dec 13 16:02:32 CST 2021}
        * =======v1属性date改变后=======
        * Video{name='黑客帝国', createTime=Thu Jan 01 08:38:46 CST 1970}
        * Video{name='黑客帝国', createTime=Mon Dec 13 16:02:32 CST 2021}
        * */

    }
}
posted @   jpy  阅读(4)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示