Java 设计模式之 原型模式

原型模式, 就是我们提供一个原型, 然后使用这样的思想就是对原型进行复制, 得到一个新的对象, 和原型对象一模一样, 但是是两个不同的对象(hashcode 不同)

一、 浅克隆

user

public class user implements Cloneable {

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

    private Integer id;
    private String name;
    private Date date;
}

Test

// 原型模式。 就是能够对之前的对象进行克隆, 然后产生一个新的对象
public class Test {

    /**
     * 浅克隆
     * 1、实现 cloneenble 接口
     * 2、重写 clone方法
     *
     * @param args
     */
    public static void main(String[] args) throws CloneNotSupportedException {
        test();
    }

    @SuppressWarnings("all")
    static void test() throws CloneNotSupportedException {
        // 1、新建原型对象
        Date date = new Date();
        user u1 = new user(1, "cyt", date);
        user u2 = (user) u1.clone();

        System.out.println("u1->" + u1);
        System.out.println("u1.hashcode->" + u1.hashCode());
        System.out.println("u2->" + u2);
        System.out.println("u2.hashcode->" + u2.hashCode());


        System.out.println("========================");
        date.setTime(132456);

        System.out.println("u1->" + u1);
        System.out.println("u2->" + u2);

        /**
         * 重新设置原型的属性, clone 对象的值也会改变
         *u1->user{id=1, name='cyt', date=Thu Apr 23 16:41:19 CST 2020}
         * u1.hashcode->1807837413
         * u2->user{id=1, name='cyt', date=Thu Apr 23 16:41:19 CST 2020}
         * u2.hashcode->1254526270
         * ========================
         * u1->user{id=1, name='cyt', date=Thu Jan 01 08:02:12 CST 1970}
         * u2->user{id=1, name='cyt', date=Thu Jan 01 08:02:12 CST 1970}
         */
    }
 
}

二、深克隆

user

public class user implements Cloneable {

    /**
     * 修改 clone 方法, 成为深克隆
     *
     * @return
     * @throws CloneNotSupportedException
     */
    @Override
    protected Object clone() throws CloneNotSupportedException {
        Object obj = super.clone();
        // 对属性也克隆 , 实现深克隆
        user u = (user) obj;
        u.date = (Date) this.date.clone();
        return obj;
    }

    private Integer id;
    private String name;
    private Date date;
    }

test

// 原型模式。 就是能够对之前的对象进行克隆, 然后产生一个新的对象
public class Test {

    /**
     * 深克隆
     * 1、实现 cloneenble 接口
     * 2、重写 clone方法, 并修改, 外加克隆属性
     *
     * @param args
     */
    public static void main(String[] args) throws CloneNotSupportedException {
        test();
    }

    @SuppressWarnings("all")
    static void test() throws CloneNotSupportedException {
        // 1、新建原型对象
        Date date = new Date();
        user u1 = new user(1, "cyt", date);
        user u2 = (user) u1.clone();

        System.out.println("u1->" + u1);
        System.out.println("u1.hashcode->" + u1.hashCode());
        System.out.println("u2->" + u2);
        System.out.println("u2.hashcode->" + u2.hashCode());


        System.out.println("========================");
        date.setTime(132456);

        System.out.println("u1->" + u1);
        System.out.println("u2->" + u2);

        /**
         * 重新设置原型的属性, clone 对象的值不会改变
         u1->user{id=1, name='cyt', date=Thu Apr 23 16:46:17 CST 2020}
         u1.hashcode->1807837413
         u2->user{id=1, name='cyt', date=Thu Apr 23 16:46:17 CST 2020}
         u2.hashcode->1254526270
         ========================
         u1->user{id=1, name='cyt', date=Thu Jan 01 08:02:12 CST 1970}
         u2->user{id=1, name='cyt', date=Thu Apr 23 16:46:17 CST 2020}
         */
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值