欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java?設計模式以虹貓藍兔的故事講解原型模式

 更新時間:2022年04月11日 08:58:12   作者:桃花鍵神  
原型模式是用于創(chuàng)建重復的對象,同時又能保證性能。這種類型的設計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式,今天通過本文給大家介紹下Java 原型設計模式,感興趣的朋友一起看看吧

什么是原型模式

原型(Prototype)模式的定義如下: 用一個已經(jīng)創(chuàng)建的實例作為原型,通過復制該原型對象來創(chuàng)建一個和原型相同或相似的新對象。在這里,原型實例指定了要創(chuàng)建的對象的種類。用這種方式創(chuàng)建對象非常高效,根本無須知道對象創(chuàng)建的細節(jié)。例如,Windows 操作系統(tǒng)的安裝通常較耗時,如果復制就快了很多。在生活中復制的例子非常多,這里不一一列舉了。

優(yōu)點

1、Java 自帶的原型模式基于內(nèi)存二進制流的復制,在性能上比直接 new 一個對象更加優(yōu)良。

2、可以使用深克隆方式保存對象的狀態(tài),使用原型模式將對象復制一份,并將其狀態(tài)保存起來,簡化了創(chuàng)建對象的過程,以便在需要的時候使用(例如恢復到歷史某一狀態(tài)),可輔助實現(xiàn)撤銷操作。

缺點

1、需要為每一個類都配置一個 clone 方法

2、clone 方法位于類的內(nèi)部,當對已有類進行改造的時候,需要修改代碼,違背了開閉原則。

3、當實現(xiàn)深克隆時,需要編寫較為復雜的代碼,而且當對象之間存在多重嵌套引用時,為了實現(xiàn)深克隆,每一層對象對應的類都必須支持深克隆,實現(xiàn)起來會比較麻煩。因此,深克隆、淺克隆需要運用得當。

應用場景

在有些系統(tǒng)中,存在大量相同或相似對象的創(chuàng)建問題,如果用傳統(tǒng)的構造函數(shù)來創(chuàng)建對象,會比較復雜且耗時耗資源,用原型模式生成對象就很高效,就像孫悟空拔下猴毛輕輕一吹就變出很多孫悟空一樣簡單。

淺克隆

案例:克隆虹貓

淺克隆一個虹貓,外表特征一樣,但是只有一個靈魂。

克隆虹貓身體受到傷害,本體虹貓不受影響。

克隆虹貓精神受到傷害,本體虹貓也受到同樣的傷害。

代碼實現(xiàn)

虹貓靈魂狀態(tài)類

這里聲明了虹貓的靈魂狀態(tài)

public class Hong {
    //虹貓的靈魂狀態(tài)
    private String lh;
    Hong(String lh) {
        this.lh = lh;
    }
    Hong() {
    }

    public String getLh() {
        return lh;
    }

    public void setLh(String lh) {
        this.lh = lh;
    }

}

虹貓個體類

實現(xiàn)了Cloneable 接口,并且有虹貓的身體狀態(tài)和靈魂狀態(tài)等屬性。

public class Qian implements Cloneable {
    private String shou;
    private String jiao;
    private String yan;
    private Hong hong;

    Qian() {
    }

    Qian(String shou, String jiao, String yan, Hong hong) {
        this.hong = hong;
        this.shou = shou;
        this.jiao = jiao;
        this.yan = yan;
    }

    public Qian clone() throws CloneNotSupportedException {
        return (Qian) super.clone();
    }

    public String getShou() {
        return shou;
    }

    public void setShou(String shou) {
        this.shou = shou;
    }

    public String getJiao() {
        return jiao;
    }

    public void setJiao(String jiao) {
        this.jiao = jiao;
    }

    public String getYan() {
        return yan;
    }

    public void setYan(String yan) {
        this.yan = yan;
    }

    public Hong getHong() {
        return hong;
    }

    public void setHong(Hong hong) {
        this.hong = hong;
    }

}

測試類

這里測試一下淺克隆的效果:

淺克隆一個虹貓,外表特征一樣,但是只有一個靈魂。

克隆虹貓身體受到傷害,本體虹貓不受影響。

克隆虹貓精神受到傷害,本體虹貓也受到同樣的傷害。

public class Demo {
    public static void main(String[] args) throws CloneNotSupportedException {
        Qian qian = new Qian("兩只手", "兩只腳", "兩只眼", new Hong("完整的靈魂"));
        Qian qian1 = qian.clone();
        System.out.printf("虹貓少俠本體的身體狀態(tài):%s,%s,%s,%s,", qian.getHong().getLh(), qian.getJiao(), qian.getShou(), qian.getYan());
        System.out.println();
        System.out.printf("虹貓少俠一號的身體狀態(tài):%s,%s,%s,%s,", qian1.getHong().getLh(), qian1.getJiao(), qian1.getShou(), qian1.getYan());

    }
}

克隆出來了一個虹貓一號,所有屬性都一模一樣

在這里插入圖片描述

public class Demo {
    public static void main(String[] args) throws CloneNotSupportedException {
        Qian qian = new Qian("兩只手", "兩只腳", "兩只眼", new Hong("完整的靈魂"));
        Qian qian1 = qian.clone();
        qian1.getHong().setLh("靈魂受到攻擊");
        qian1.setJiao("斷了一只腳");
        System.out.printf("虹貓少俠本體的身體狀態(tài):%s,%s,%s,%s,", qian.getHong().getLh(), qian.getJiao(), qian.getShou(), qian.getYan());
        System.out.println();
        System.out.printf("虹貓少俠一號的身體狀態(tài):%s,%s,%s,%s,", qian1.getHong().getLh(), qian1.getJiao(), qian1.getShou(), qian1.getYan());
    }
}

這里克隆虹貓的腳和靈魂都受到了傷害,本體虹貓的身體沒有受到影響,但是靈魂卻受到了傷害。

在這里插入圖片描述

總結(jié)

一、為什么淺克隆中虹貓一號的腳受到了傷害,本體虹貓卻沒受到傷害?

二、為什么淺克隆中虹貓一號的靈魂受到了傷害,本體虹貓也受到了傷害?

因為創(chuàng)建一個新對象,新對象的屬性和原來對象完全相同,對于非基本類型屬性,仍指向原有屬性所指向的對象的內(nèi)存地址。 兩個虹貓的靈魂指向同一個內(nèi)存地址,所以存儲的是同一個靈魂。

深克隆

案例:克隆虹貓

深克隆一個虹貓,外表特征一樣,都有獨立靈魂。

克隆虹貓身體受到傷害,本體虹貓不受影響。

克隆虹貓精神受到傷害,本體虹貓也不受影響。

代碼實現(xiàn)

虹貓靈魂狀態(tài)類

這里聲明了虹貓的靈魂狀態(tài),并且實現(xiàn)了Cloneable 接口,克隆一個虹貓靈魂

public class Hong implements Cloneable {
    //虹貓的靈魂狀態(tài)
    private String lh;

    Hong(String lh) {
        this.lh = lh;
    }

    Hong() {
    }

    public Hong clone() throws CloneNotSupportedException {
        return (Hong) super.clone();
    }

    public String getLh() {
        return lh;
    }

    public void setLh(String lh) {
        this.lh = lh;
    }

}

虹貓個體類

重寫了clone方法,在clone方法中調(diào)用了hong.clone()方法克隆了一個虹貓靈魂

public class Qian implements Cloneable {
    private String shou;
    private String jiao;
    private String yan;
    private Hong hong;

    Qian() {
    }

    Qian(String shou, String jiao, String yan, Hong hong) {
        this.hong = hong;
        this.shou = shou;
        this.jiao = jiao;
        this.yan = yan;
    }

    public Qian clone() throws CloneNotSupportedException {
        Qian qian = (Qian) super.clone();
        hong = hong.clone();
        return qian;

    }

    public String getShou() {
        return shou;
    }

    public void setShou(String shou) {
        this.shou = shou;
    }

    public String getJiao() {
        return jiao;
    }

    public void setJiao(String jiao) {
        this.jiao = jiao;
    }

    public String getYan() {
        return yan;
    }

    public void setYan(String yan) {
        this.yan = yan;
    }

    public Hong getHong() {
        return hong;
    }

    public void setHong(Hong hong) {
        this.hong = hong;
    }

}

測試類

這里測試一下淺克隆的效果:

深克隆一個虹貓,外表特征一樣,都有獨立靈魂。

克隆虹貓身體受到傷害,本體虹貓不受影響。

克隆虹貓精神受到傷害,本體虹貓也不受影響。

public class Demo {
    public static void main(String[] args) throws CloneNotSupportedException {
        Qian qian = new Qian("兩只手", "兩只腳", "兩只眼", new Hong("完整的靈魂"));
        Qian qian1 = qian.clone();
        qian1.getHong().setLh("靈魂受到攻擊");
        qian1.setJiao("斷了一只腳");
        System.out.printf("虹貓少俠本體的身體狀態(tài):%s,%s,%s,%s,", qian.getHong().getLh(), qian.getJiao(), qian.getShou(), qian.getYan());
        System.out.println();
        System.out.printf("虹貓少俠一號的身體狀態(tài):%s,%s,%s,%s,", qian1.getHong().getLh(), qian1.getJiao(), qian1.getShou(), qian1.getYan());
    }
}

在這里插入圖片描述

深克隆出的虹貓完全是個獨立的個體,再也不用受限制了。

總結(jié)

深克?。簞?chuàng)建一個新對象,屬性中引用的其他對象也會被克隆,不再指向原有對象地址。

到此這篇關于Java 設計模式以虹貓藍兔的故事講解原型模式的文章就介紹到這了,更多相關Java 原型模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 全面了解Java中的內(nèi)部類和匿名類

    全面了解Java中的內(nèi)部類和匿名類

    下面小編就為大家?guī)硪黄媪私釰ava中的內(nèi)部類和匿名類。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-07-07
  • Javacv使用ffmpeg實現(xiàn)音視頻同步播放

    Javacv使用ffmpeg實現(xiàn)音視頻同步播放

    這篇文章主要介紹了Javacv使用ffmpeg實現(xiàn)音視頻同步播放,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • springboot中使用自定義兩級緩存的方法

    springboot中使用自定義兩級緩存的方法

    這篇文章主要介紹了springboot中使用自定義兩級緩存的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • Java數(shù)據(jù)結(jié)構之平衡二叉樹的原理與實現(xiàn)

    Java數(shù)據(jù)結(jié)構之平衡二叉樹的原理與實現(xiàn)

    平衡樹(Balance Tree,BT) 指的是,任意節(jié)點的子樹的高度差都小于等于1。常見的符合平衡樹的有,B樹(多路平衡搜索樹)、AVL樹(二叉平衡搜索樹)等。本文將詳細介紹平衡二叉樹的概念和實現(xiàn)原理以及它的實現(xiàn)
    2022-01-01
  • Spring連接Mysql數(shù)據(jù)庫的實現(xiàn)步驟

    Spring連接Mysql數(shù)據(jù)庫的實現(xiàn)步驟

    本文主要介紹了Spring連接Mysql數(shù)據(jù)庫的實現(xiàn)步驟,文中根據(jù)實例編碼詳細介紹的十分詳盡,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • postman中實現(xiàn)傳遞@RequestBody參數(shù)

    postman中實現(xiàn)傳遞@RequestBody參數(shù)

    這篇文章主要介紹了postman中實現(xiàn)傳遞@RequestBody參數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 簡單了解JAVA變量類型及代碼實例

    簡單了解JAVA變量類型及代碼實例

    這篇文章主要介紹了簡單了解JAVA變量類型及代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • mybatis實現(xiàn)特殊字段加密方式

    mybatis實現(xiàn)特殊字段加密方式

    這篇文章主要介紹了mybatis實現(xiàn)特殊字段加密,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • JavaGUI事件監(jiān)聽機制超詳細講解

    JavaGUI事件監(jiān)聽機制超詳細講解

    Java事件監(jiān)聽器是由事件類和監(jiān)聽接口組成,自定義一個事件前,必須提供一個事件的監(jiān)聽接口以及一個事件類。JAVA中監(jiān)聽接口是繼承java.util.EventListener的類,事件類繼承java.util.EventObject的類
    2023-03-03
  • webuploader在springMVC+jquery+Java開發(fā)環(huán)境下的大文件分片上傳的實例代碼

    webuploader在springMVC+jquery+Java開發(fā)環(huán)境下的大文件分片上傳的實例代碼

    這篇文章主要介紹了webuploader在springMVC+jquery+Java開發(fā)環(huán)境下的大文件分片上傳的實例代碼,需要的朋友可以參考下
    2017-04-04

最新評論