最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java?設(shè)計(jì)模式以虹貓藍(lán)兔的故事講解原型模式

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

什么是原型模式

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

優(yōu)點(diǎn)

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

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

缺點(diǎn)

1、需要為每一個(gè)類(lèi)都配置一個(gè) clone 方法

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

3、當(dāng)實(shí)現(xiàn)深克隆時(shí),需要編寫(xiě)較為復(fù)雜的代碼,而且當(dāng)對(duì)象之間存在多重嵌套引用時(shí),為了實(shí)現(xiàn)深克隆,每一層對(duì)象對(duì)應(yīng)的類(lèi)都必須支持深克隆,實(shí)現(xiàn)起來(lái)會(huì)比較麻煩。因此,深克隆、淺克隆需要運(yùn)用得當(dāng)。

應(yīng)用場(chǎng)景

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

淺克隆

案例:克隆虹貓

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

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

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

代碼實(shí)現(xiàn)

虹貓靈魂?duì)顟B(tài)類(lèi)

這里聲明了虹貓的靈魂?duì)顟B(tài)

public class Hong {
    //虹貓的靈魂?duì)顟B(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;
    }

}

虹貓個(gè)體類(lèi)

實(shí)現(xiàn)了Cloneable 接口,并且有虹貓的身體狀態(tài)和靈魂?duì)顟B(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;
    }

}

測(cè)試類(lèi)

這里測(cè)試一下淺克隆的效果:

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

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

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

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("虹貓少俠一號(hào)的身體狀態(tài):%s,%s,%s,%s,", qian1.getHong().getLh(), qian1.getJiao(), qian1.getShou(), qian1.getYan());

    }
}

克隆出來(lái)了一個(gè)虹貓一號(hào),所有屬性都一模一樣

在這里插入圖片描述

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("虹貓少俠一號(hào)的身體狀態(tài):%s,%s,%s,%s,", qian1.getHong().getLh(), qian1.getJiao(), qian1.getShou(), qian1.getYan());
    }
}

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

在這里插入圖片描述

總結(jié)

一、為什么淺克隆中虹貓一號(hào)的腳受到了傷害,本體虹貓卻沒(méi)受到傷害?

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

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

深克隆

案例:克隆虹貓

深克隆一個(gè)虹貓,外表特征一樣,都有獨(dú)立靈魂。

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

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

代碼實(shí)現(xiàn)

虹貓靈魂?duì)顟B(tài)類(lèi)

這里聲明了虹貓的靈魂?duì)顟B(tài),并且實(shí)現(xiàn)了Cloneable 接口,克隆一個(gè)虹貓靈魂

public class Hong implements Cloneable {
    //虹貓的靈魂?duì)顟B(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;
    }

}

虹貓個(gè)體類(lèi)

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

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;
    }

}

測(cè)試類(lèi)

這里測(cè)試一下淺克隆的效果:

深克隆一個(gè)虹貓,外表特征一樣,都有獨(dú)立靈魂。

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

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

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("虹貓少俠一號(hào)的身體狀態(tài):%s,%s,%s,%s,", qian1.getHong().getLh(), qian1.getJiao(), qian1.getShou(), qian1.getYan());
    }
}

在這里插入圖片描述

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

總結(jié)

深克隆:創(chuàng)建一個(gè)新對(duì)象,屬性中引用的其他對(duì)象也會(huì)被克隆,不再指向原有對(duì)象地址。

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

相關(guān)文章

  • Springmvc DispatcherServlet原理及用法解析

    Springmvc DispatcherServlet原理及用法解析

    這篇文章主要介紹了Springmvc DispatcherServlet原理及用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • springboot 整合druid及配置依賴(lài)

    springboot 整合druid及配置依賴(lài)

    這篇文章主要介紹了springboot 整合druid及jdbc 依賴(lài)、數(shù)據(jù)庫(kù)依賴(lài)(mysql),druid 依賴(lài)的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • 使用Jackson進(jìn)行JSON生成與解析的新手指南

    使用Jackson進(jìn)行JSON生成與解析的新手指南

    這篇文章主要為大家詳細(xì)介紹了如何使用Jackson進(jìn)行JSON生成與解析處理,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-04-04
  • java時(shí)區(qū)轉(zhuǎn)換的理解及示例詳解

    java時(shí)區(qū)轉(zhuǎn)換的理解及示例詳解

    這篇文章主要介紹了java時(shí)區(qū)轉(zhuǎn)換的理解及示例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Spring框架構(gòu)造注入操作實(shí)戰(zhàn)案例

    Spring框架構(gòu)造注入操作實(shí)戰(zhàn)案例

    這篇文章主要介紹了Spring框架構(gòu)造注入操作,結(jié)合具體實(shí)例形式分析了spring框架構(gòu)造輸入的相關(guān)定義與使用操作技巧,需要的朋友可以參考下
    2019-11-11
  • SpringBoot2.0整合tk.mybatis異常解決

    SpringBoot2.0整合tk.mybatis異常解決

    本文主要介紹了SpringBoot2.0整合tk.mybatis異常,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Spring Boot中@RequestParam參數(shù)的5種情況說(shuō)明

    Spring Boot中@RequestParam參數(shù)的5種情況說(shuō)明

    這篇文章主要介紹了Spring Boot中@RequestParam參數(shù)的5種情況說(shuō)明,具有很好的參考價(jià)值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • SpringMVC 使用JSR-303進(jìn)行校驗(yàn) @Valid示例

    SpringMVC 使用JSR-303進(jìn)行校驗(yàn) @Valid示例

    本篇文章主要介紹了SpringMVC 使用JSR-303進(jìn)行校驗(yàn) @Valid示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-02-02
  • SpringBoot整合sharding-jdbc?實(shí)現(xiàn)分庫(kù)分表操作的示例代碼

    SpringBoot整合sharding-jdbc?實(shí)現(xiàn)分庫(kù)分表操作的示例代碼

    在Spring?Boot中使用ShardingSphere的Sharding-JDBC來(lái)實(shí)現(xiàn)數(shù)據(jù)庫(kù)的分庫(kù)分表是一個(gè)常見(jiàn)的需求,下面就拉具體介紹一下實(shí)現(xiàn)步驟,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04
  • Spring如何通過(guò)@Lazy注解解決構(gòu)造方法循環(huán)依賴(lài)問(wèn)題

    Spring如何通過(guò)@Lazy注解解決構(gòu)造方法循環(huán)依賴(lài)問(wèn)題

    循環(huán)依賴(lài)其實(shí)就是循環(huán)引用,也就是兩個(gè)或則兩個(gè)以上的bean互相持有對(duì)方,最終形成閉環(huán),這篇文章主要給大家介紹了關(guān)于Spring如何通過(guò)@Lazy注解解決構(gòu)造方法循環(huán)依賴(lài)問(wèn)題的相關(guān)資料,需要的朋友可以參考下
    2023-03-03

最新評(píng)論

六安市| 托里县| 平遥县| 宝兴县| 太白县| 土默特右旗| 嵩明县| 聂荣县| 红河县| 汽车| 拉孜县| 延安市| 闽侯县| 庐江县| 九江市| 美姑县| 枞阳县| 旬阳县| 金坛市| 芜湖县| 龙陵县| 台前县| 丰城市| 精河县| 永川市| 西藏| 湘阴县| 肥西县| 阳山县| 东乌珠穆沁旗| 乳山市| 邮箱| 尉氏县| 名山县| 综艺| 宜都市| 高尔夫| 句容市| 诸城市| 五家渠市| 龙江县|