【JAVA設計模式】- 原型模式

原型模式

創建重複的對象,這種設計模式屬於創建型模式,這種模式實現了一個原型接口,用於創建當前對象的克隆

克隆分爲:淺克隆和深克隆

  • 淺克隆

被複制對象的所有變量都含有與原來的對象相同的值,而所有的對其他對象的引用仍然指向原來的對象。換言之,淺複製僅僅複製所拷貝的對象,而不復制它所引用的對象。

  • 深克隆

被複制對象的所有變量都含有與原來的對象相同的值,除去那些引用其他對象的變量。那些引用其他對象的變量將指向被複制過的新對象,而不再是原有的那些被引用的對象。換言之,深複製把要複製的對象所引用的對象都複製了一遍。

克隆方法

淺克隆:
1.實現 cloneable接口
2.重寫一個方法

深克隆:
在淺克隆的基礎上改造克隆方法

實現:Video的淺克隆
在這裏插入圖片描述
Video.java

package com.li.phototype.demo01;

import java.util.Date;

/*
1.實現 Cloneable接口
2.重新一個方法
 */

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

bililili.java

package com.li.phototype.demo01;

import java.util.Date;

/*
客戶端:克隆
 */
public class Bililili {

    public static void main(String[] args) throws CloneNotSupportedException {
        //原型對象 v1
        Date date = new Date();
        Video v1 = new Video("Java",date);
        Video v2 = (Video)v1.clone();//克隆出來的對象一樣

        System.out.println("v1=>"+v1);
        System.out.println("v2=>"+v2);
       // System.out.println("v1=>hash:"+v1.hashCode());
       // System.out.println("v2=>hash:"+v2.hashCode());

        System.out.println("------------------");
        date.setTime(2213323);
        System.out.println("v1=>"+v1);
        System.out.println("v2=>"+v1);
    }

}

控制檯
在這裏插入圖片描述

Video的深克隆
在這裏插入圖片描述
Video.java


```java
package com.li.phototype.demo02;

import java.util.Date;

/*
改造克隆方法
 */

//視頻
public class Video implements Cloneable {

    private String name;
    private Date createTime;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        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 +
                '}';
    }
}

bililili.java

package com.li.phototype.demo02;

import java.util.Date;

/*
客戶端:克隆
 */
public class Bililili {

    public static void main(String[] args) throws CloneNotSupportedException {
        //原型對象 v1
        Date date = new Date();
        Video v1 = new Video("Java",date);
        Video v2 = (Video)v1.clone();//克隆出來的對象一樣

        System.out.println("v1=>"+v1);
        System.out.println("v2=>"+v2);
       // System.out.println("v1=>hash:"+v1.hashCode());
       // System.out.println("v2=>hash:"+v2.hashCode());

        System.out.println("------------------");
        date.setTime(2213323);
        System.out.println("v1=>"+v1);
        System.out.println("v2=>"+v1);
    }

}

控制檯
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章