1. 程式人生 > 實用技巧 >設計模式6——原型模式

設計模式6——原型模式

設計模式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);
    }
}

淺克隆:

深克隆: