设计模式6——原型模式

package com.ghl.prototype.demo01;

import javax.xml.crypto.Data;
import java.util.Date;

/**
 * @ProjectName DesignPattern
 * @ClassName video
 * @Date 2020/8/26 22:24
 * @Author gaohengli
 * @Version 1.0
 */
/*
1.实现一个类 Cloneable
2.重写一个方法 clone()
 */

//原型模式
    //克隆别人的视频
public class Video implements Cloneable {

    private String name;
    private Date createTime;

    //重写克隆方法
    @Override
    protected Object clone() throws CloneNotSupportedException {
        //浅克隆
        //return super.clone();

        Object obj=super.clone();
        Video v=(Video)obj;
        //实现深克隆,将这个对象的属性也进行克隆
        v.createTime= (Date) this.createTime.clone();

        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 +
                '}';
    }
}
package com.ghl.prototype.demo01;

import java.util.Date;

/**
 * @ProjectName DesignPattern
 * @ClassName BiliBili
 * @Date 2020/8/26 22:30
 * @Author gaohengli
 * @Version 1.0
 */
//客户端,克隆
public class BiliBili {
    public static void main(String[] args) throws CloneNotSupportedException {
        //原型对象v1
        Date date = new Date();//当前日期
        Video v1 = new Video("ghl", 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());
        //修改克隆的对象
        v2.setName("clone:ghl");
        System.out.println("修改后的v2:"+v2);

        //浅克隆(日期更改后,clone出来的实例的日期也会更改,未完全成为一个独立个体)
        //深客隆(深克隆还可以使用序列化,反序列化实现)
        System.out.println("v1->"+v1);
        System.out.println("v2->"+v2);

        date.setTime(2222);

        System.out.println("v1->"+v1);
        System.out.println("v2->"+v2);
    }
}

浅克隆:

深克隆: