日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

一文搞懂設(shè)計模式—享元模式

來源: 責(zé)編: 時間:2024-02-29 14:43:15 254觀看
導(dǎo)讀當(dāng)系統(tǒng)中存在大量相似對象時,每個對象都需要占用一定的內(nèi)存空間,如果這些對象的大部分屬性是相同的,那么頻繁創(chuàng)建這些對象會導(dǎo)致內(nèi)存消耗過大。享元模式將這些相同部分抽取出來作為共享的內(nèi)部狀態(tài),在需要時進(jìn)行共享,從而減

當(dāng)系統(tǒng)中存在大量相似對象時,每個對象都需要占用一定的內(nèi)存空間,如果這些對象的大部分屬性是相同的,那么頻繁創(chuàng)建這些對象會導(dǎo)致內(nèi)存消耗過大。享元模式將這些相同部分抽取出來作為共享的內(nèi)部狀態(tài),在需要時進(jìn)行共享,從而減少內(nèi)存占用。dDS28資訊網(wǎng)——每日最新資訊28at.com

享元模式(Flyweight Pattern)是一種結(jié)構(gòu)型設(shè)計模式,旨在通過共享對象來最大化內(nèi)存利用和性能提升,享元模式嘗試重用現(xiàn)有的同類對象,如果未找到匹配的對象,則創(chuàng)建新對象。dDS28資訊網(wǎng)——每日最新資訊28at.com

使用場景

  • 當(dāng)系統(tǒng)中存在大量相似對象且造成了內(nèi)存浪費時,可以考慮使用享元模式。
  • 對象的狀態(tài)可以外部化,并且剝離出共享部分和特有部分。
  • 需要緩沖池的場景。

享元模式在對象池中的使用是一種常見的場景,通過對象池管理和復(fù)用對象實例,可以提高系統(tǒng)性能和資源利用率。對象池通常用于緩存、連接池等場景,其中對象的創(chuàng)建成本較高或者頻繁創(chuàng)建銷毀會影響性能時,對象池就顯得尤為重要。dDS28資訊網(wǎng)——每日最新資訊28at.com

在 Java 中,String 類的 intern() 方法是享元模式的一個應(yīng)用。intern() 方法返回字符串對象的規(guī)范化表示形式,即返回字符串池中與調(diào)用字符串等效的字符串。如果字符串池中已經(jīng)存在等效的字符串,則返回該字符串;否則,將此字符串添加到字符串池中,并返回新的字符串引用。dDS28資訊網(wǎng)——每日最新資訊28at.com

下面是一個示例代碼,演示了 String 類的 intern() 方法的應(yīng)用:dDS28資訊網(wǎng)——每日最新資訊28at.com

public class StringInternExample {    public static void main(String[] args) {        String str1 = "hello";        String str2 = new String("hello");        String str3 = str2.intern();        System.out.println("str1 == str2: " + (str1 == str2)); // false        System.out.println("str1 == str3: " + (str1 == str3)); // true    }}

在上述示例中,str1 和 str2 是兩個不同的字符串對象,盡管它們的值相同,但由于 str2 使用了 new String() 構(gòu)造方法創(chuàng)建,在堆內(nèi)存中會生成一個新的對象。而通過調(diào)用 intern() 方法后,str3 返回的是字符串池中已存在的字符串對象,因此 str1 和 str3 指向的是同一個對象,所以輸出結(jié)果為 "str1 == str3: true"。這就是 intern() 方法的享元模式應(yīng)用,避免了重復(fù)創(chuàng)建相同的字符串對象,節(jié)省了內(nèi)存空間。dDS28資訊網(wǎng)——每日最新資訊28at.com

具體實現(xiàn)

享元模式包含以下幾個角色:dDS28資訊網(wǎng)——每日最新資訊28at.com

  • 抽象享元(Flyweight): 定義了享元對象的外部狀態(tài)和內(nèi)部狀態(tài),通過這個抽象類可以接受并作用于外部狀態(tài)。
  • 具體享元(Concrete Flyweight): 繼承了抽象享元類,包含內(nèi)部狀態(tài)和外部狀態(tài)。具體享元對象需要確保內(nèi)部狀態(tài)是可以共享的,同時提供操作外部狀態(tài)的方法。
  • 非共享具體享元(Unshared Concrete Flyweight): 與共享具體享元相對應(yīng),非共享具體享元是不能被共享的享元對象,通常是在具體享元中無法共享的情況下使用。
  • 享元工廠(Flyweight Factory): 負(fù)責(zé)創(chuàng)建和管理享元對象,在請求時返回已經(jīng)創(chuàng)建的享元對象實例或者新創(chuàng)建一個享元對象。享元工廠通常會維護(hù)一個享元池用于存儲已經(jīng)創(chuàng)建的享元對象。

在享元模式中,核心在于區(qū)分內(nèi)部狀態(tài)和外部狀態(tài)。內(nèi)部狀態(tài)是可以共享的部分,而外部狀態(tài)是對象的非共享部分。dDS28資訊網(wǎng)——每日最新資訊28at.com

  • 內(nèi)部狀態(tài)(Intrinsic State): 內(nèi)部狀態(tài)是享元對象固有的、可以共享的狀態(tài),它存儲在享元對象內(nèi)部并且不會隨著外部環(huán)境的變化而改變。內(nèi)部狀態(tài)可以被多個享元對象共享,因此通常將其設(shè)計為不可變的屬性。內(nèi)部狀態(tài)對于享元對象的具體實現(xiàn)是必需的,但不會隨著外部環(huán)境的變化而改變。
  • 外部狀態(tài)(Extrinsic State): 外部狀態(tài)是享元對象的可變部分,它隨著外部環(huán)境的變化而變化,需要通過客戶端傳入享元對象來進(jìn)行處理。外部狀態(tài)并不影響享元對象的內(nèi)部結(jié)構(gòu)或行為,它只是作為享元對象行為的參數(shù)或上下文信息傳入。外部狀態(tài)具有固化特性,不應(yīng)該隨內(nèi)部狀態(tài)改變而改變,否則導(dǎo)致系統(tǒng)的邏輯混亂。

通過區(qū)分內(nèi)部狀態(tài)和外部狀態(tài),享元模式實現(xiàn)了將對象的共享部分和變化部分分離的目的,有效地減少了系統(tǒng)中重復(fù)對象的數(shù)量,提高了系統(tǒng)的性能和資源利用率。內(nèi)部狀態(tài)是享元對象本身的屬性,而外部狀態(tài)則是根據(jù)具體情況動態(tài)變化的參數(shù)。dDS28資訊網(wǎng)——每日最新資訊28at.com

實現(xiàn)步驟和示例代碼如下:dDS28資訊網(wǎng)——每日最新資訊28at.com

1.首先定義抽象享元角色。dDS28資訊網(wǎng)——每日最新資訊28at.com

public abstract class Flyweight {    //內(nèi)部狀態(tài)    private String intrinsic;    //外部狀態(tài)    protected final String extrinsic;    //要求享元角色必須接受外部狀態(tài)    public Flyweight(String extrinsic){        this.extrinsic = extrinsic;    }    //定義業(yè)務(wù)操作    public abstract void operate();    //內(nèi)部狀態(tài)的getter/setter    public String getIntrinsic() {        return intrinsic;    }    public void setIntrinsic(String intrinsic) {        this.intrinsic = intrinsic;    }}

抽象享元角色一般為抽象類,它是描述一類事物的方法。dDS28資訊網(wǎng)——每日最新資訊28at.com

2.具體享元角色。dDS28資訊網(wǎng)——每日最新資訊28at.com

public class ConcreteFlyweight1 extends Flyweight{    //接受外部狀態(tài)    public ConcreteFlyweight1(String extrinsic){        super(extrinsic);    }    //根據(jù)外部狀態(tài)進(jìn)行邏輯處理    public void operate(){    //業(yè)務(wù)邏輯    }}
public class ConcreteFlyweight2 extends Flyweight{    //接受外部狀態(tài)    public ConcreteFlyweight2(String extrinsic){        super(extrinsic);    }    //根據(jù)外部狀態(tài)進(jìn)行邏輯處理    public void operate(){    //業(yè)務(wù)邏輯    }}

具體享元角色實現(xiàn)自己的業(yè)務(wù)邏輯,然后接收外部狀態(tài),以便內(nèi)部業(yè)務(wù)邏輯對外部狀態(tài)的依賴。dDS28資訊網(wǎng)——每日最新資訊28at.com

3.享元工廠。dDS28資訊網(wǎng)——每日最新資訊28at.com

public class FlyweightFactory {    //定義一個池容器    private static Map<String, Flyweight> pool = new HashMap<>();    //享元工廠    public static Flyweight getFlyweight(String extrinsic) {        //需要返回的對象        Flyweight flyweight;        //在池中沒有該對象        if (pool.containsKey(extrinsic)) {            flyweight = pool.get(extrinsic);        } else {            //根據(jù)外部狀態(tài)創(chuàng)建享元對象            flyweight = new ConcreteFlyweight1(extrinsic);            //放置到池中            pool.put(extrinsic, flyweight);        }        return flyweight;    }}

4.客戶端調(diào)用dDS28資訊網(wǎng)——每日最新資訊28at.com

public static void main(String[] args) {        Flyweight flyweight1 = FlyweightFactory.getFlyweight("hello world");        System.out.println(flyweight1.hashCode());        Flyweight flyweight2 = FlyweightFactory.getFlyweight("hello world");        System.out.println(flyweight2.hashCode());    }    Output:    1705736037    1705736037

可以發(fā)現(xiàn)對象打印的 hashCode 一致,說明對象得到了復(fù)用。dDS28資訊網(wǎng)——每日最新資訊28at.com

Tips:外部狀態(tài)最好以Java的基本類型作為標(biāo)志,如String、int等,可以大幅地提升效率。如果使用自己編寫的類作為外部狀態(tài),則必須覆寫equals方法和hashCode方法,否則會出現(xiàn)通過鍵值搜索失敗的情況,例如map.get(object)、map.contains(object)等會返回失敗的結(jié)果。dDS28資訊網(wǎng)——每日最新資訊28at.com

線程安全問題

享元模式在多線程環(huán)境下可能存在線程安全問題,主要原因是享元對象的內(nèi)部狀態(tài)和外部狀態(tài)被多個線程共享和修改,可能導(dǎo)致數(shù)據(jù)競爭和不一致性。具體來說,如果多個線程同時嘗試修改同一個享元對象的外部狀態(tài),就會引發(fā)線程安全問題。dDS28資訊網(wǎng)——每日最新資訊28at.com

下面是示例代碼:dDS28資訊網(wǎng)——每日最新資訊28at.com

public static void main(String[] args) {        for (int i = 0; i < 10; i++) {            new Thread(() -> {                Flyweight flyweight1 = FlyweightFactory.getFlyweight("hello world");                Flyweight flyweight2 = FlyweightFactory.getFlyweight("hello world");                System.out.println(flyweight1 == flyweight2);            }).start();        }    }Output:truefalsetruetruetruetruetruetruetruetrue

這段代碼展示了多線程環(huán)境下使用享元模式的示例。在 main 方法中,通過循環(huán)創(chuàng)建了 10 個線程,在每個線程中嘗試獲取表示 "hello world" 的享元對象,并比較兩個獲取的對象是否相等。dDS28資訊網(wǎng)——每日最新資訊28at.com

可以觀察到輸出中存在 false,說明對象不一樣了,存在線程安全問題。dDS28資訊網(wǎng)——每日最新資訊28at.com

要想實現(xiàn)線程安全,需要對享元工廠類稍加改造,代碼如下:dDS28資訊網(wǎng)——每日最新資訊28at.com

public class FlyweightFactory {    //定義一個池容器    private static Map<String, Flyweight> pool = new ConcurrentHashMap<>();    //享元工廠    public static synchronized Flyweight getFlyweight(String extrinsic) {        Flyweight flyweight = pool.putIfAbsent(extrinsic, new ConcreteFlyweight1(extrinsic));        if (flyweight == null) {            return pool.get(extrinsic);        }        return flyweight;    }}

這樣就解決了線程安全問題,不過性能上會有所降低,在需要的地方考慮一下線程安全即可,在大部分的場景下都不用考慮。dDS28資訊網(wǎng)——每日最新資訊28at.com

總結(jié)

享元模式通過共享相似對象來減少內(nèi)存消耗,提高系統(tǒng)性能。它適用于存在大量相似對象且造成內(nèi)存浪費的場景,但需要注意對內(nèi)部狀態(tài)和外部狀態(tài)的管理。合理應(yīng)用享元模式可以有效優(yōu)化系統(tǒng)架構(gòu),提升性能。dDS28資訊網(wǎng)——每日最新資訊28at.com

優(yōu)點dDS28資訊網(wǎng)——每日最新資訊28at.com

  • 大幅減少內(nèi)存使用,提高系統(tǒng)性能,實現(xiàn)了對象的復(fù)用,節(jié)約資源。
  • 在一定程度上實現(xiàn)了對象狀態(tài)的外部化,方便對對象狀態(tài)的管理和維護(hù)。

缺點dDS28資訊網(wǎng)——每日最新資訊28at.com

  • 對象狀態(tài)的外部化可能導(dǎo)致系統(tǒng)不穩(wěn)定,需要謹(jǐn)慎設(shè)計。
  • 提高了系統(tǒng)的復(fù)雜度,需要分離出外部狀態(tài)和內(nèi)部狀態(tài),而且外部狀態(tài)具有固有化的性質(zhì),不應(yīng)該隨著內(nèi)部狀態(tài)的變化而變化,否則會造成系統(tǒng)的混亂。

本文鏈接:http://m.www897cc.com/showinfo-26-75345-0.html一文搞懂設(shè)計模式—享元模式

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 前端開發(fā):Visual Studio Code和Visual studio如何選?

下一篇: 六大前端自動化測試框架推薦,提升你的開發(fā)效率與質(zhì)量

標(biāo)簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
在线视频欧美日韩精品| 亚洲成人在线视频播放| 欧美日本精品一区二区三区| 欧美日韩一区三区| 国产精品久久久久久模特 | 老司机精品久久| 欧美www在线| 欧美三级电影网| 国产一区二区三区电影在线观看| 亚洲高清久久网| 在线综合亚洲| 久久久久99| 欧美日韩三级在线| 国产一区二区看久久| 久久艳片www.17c.com| 午夜精品福利一区二区蜜股av| 99re国产精品| 先锋影音一区二区三区| 久久永久免费| 欧美性淫爽ww久久久久无| 国模私拍视频一区| 一本大道久久a久久精品综合 | 亚洲在线观看视频| 久久久久国产精品人| 欧美日韩和欧美的一区二区| 国产视频在线观看一区二区| 亚洲黄色性网站| 亚洲人体影院| 欧美一区二区在线观看| 欧美剧在线观看| 韩国精品一区二区三区| 亚洲先锋成人| 欧美亚洲综合久久| 欧美极品aⅴ影院| 激情久久五月天| 亚洲专区在线视频| 欧美国产日韩视频| 精品成人一区| 午夜精品久久久久久久99热浪潮| 欧美激情欧美激情在线五月| 国产亚洲成人一区| 亚洲午夜电影网| 欧美成人亚洲| 尤妮丝一区二区裸体视频| 亚洲综合色噜噜狠狠| 欧美精品乱码久久久久久按摩| 国内久久精品| 欧美一级黄色网| 午夜日本精品| 欧美日韩精品在线播放| 亚洲国产一区二区精品专区| 久久激情综合| 欧美不卡在线| 国产一区激情| 香蕉成人啪国产精品视频综合网| 久久国产精品72免费观看| 欧美日韩www| 亚洲国产日韩欧美在线99| 99成人免费视频| 麻豆精品在线视频| 狠狠爱成人网| 久久国产免费看| 国产精品入口福利| 亚洲网站啪啪| 欧美色道久久88综合亚洲精品| 亚洲精品一区在线观看香蕉| 女主播福利一区| 亚洲国产欧美一区二区三区久久| 久久免费高清视频| 激情欧美一区| 久久九九久精品国产免费直播| 国产农村妇女毛片精品久久莱园子 | 99视频有精品| 欧美精品在线观看播放| 亚洲精品午夜精品| 欧美韩日精品| 亚洲精品一区二区三区99| 欧美电影在线观看| 亚洲国产一区二区三区a毛片| 免费视频一区| 亚洲国产专区| 欧美另类高清视频在线| 99re热这里只有精品视频| 欧美日韩精品在线观看| 中日韩美女免费视频网址在线观看| 欧美日韩大陆在线| 国产在线不卡精品| 欧美在线亚洲一区| 国内揄拍国内精品久久| 久久久亚洲精品一区二区三区| 精品91视频| 亚洲一区在线直播| 欧美性视频网站| 亚洲男人第一av网站| 欧美激情女人20p| 亚洲精品在线视频| 欧美日韩国产成人在线91| 一区二区三区欧美亚洲| 免费日韩av| 亚洲国产日韩在线| 欧美日本高清| 国产深夜精品| 亚洲精品小视频| 欧美日韩国产精品成人| 亚洲午夜av电影| 国产亚洲成年网址在线观看| 久久免费偷拍视频| 亚洲精品日韩激情在线电影| 欧美日韩中国免费专区在线看| 亚洲欧美日产图| 国内一区二区三区| 欧美精品日韩www.p站| 亚洲一区视频在线| 国语自产精品视频在线看一大j8| 欧美成年人视频网站| 中文一区二区在线观看| 国产午夜精品在线| 欧美高清视频一区二区| 亚洲午夜免费视频| 国内视频一区| 欧美日韩国产高清| 久久激情综合| 日韩一级二级三级| 国产精品自拍三区| 欧美**字幕| 亚洲嫩草精品久久| 亚洲成人原创| 国产精品久久综合| 噜噜噜91成人网| 亚洲一卡二卡三卡四卡五卡| 国产主播喷水一区二区| 欧美破处大片在线视频| 欧美在线观看天堂一区二区三区| 亚洲国产成人高清精品| 国产精品久久久久久久久| 久久综合狠狠| 亚洲无线一线二线三线区别av| 国内久久精品| 欧美午夜激情视频| 老司机免费视频一区二区| 亚洲伊人久久综合| 亚洲国产一区二区三区a毛片| 国产精品亚洲成人| 欧美黄污视频| 久久精品夜夜夜夜久久| 一区二区三区免费网站| 国产一区欧美日韩| 欧美丰满少妇xxxbbb| 欧美中文字幕不卡| 中文精品在线| 亚洲韩国精品一区| 国产一区二区精品久久| 国产精品hd| 欧美激情第9页| 久久免费国产精品1| 亚洲欧美一区二区原创| 亚洲美女淫视频| 在线精品在线| 国产一区二区三区黄视频| 欧美香蕉视频| 欧美精品不卡| 毛片精品免费在线观看| 欧美一区二区三区的| 在线视频你懂得一区二区三区| 国产一区二区三区高清| 国产性天天综合网| 久久精品视频99| 最近中文字幕mv在线一区二区三区四区| 99国产精品久久久久久久成人热| 亚洲视频999| 欧美国产日韩精品| 国产精品亚洲美女av网站| 一区二区三区久久| 久久影视三级福利片| 在线成人激情黄色| 免费毛片一区二区三区久久久| 亚洲美女一区| 国产日韩精品一区| 欧美精品v日韩精品v韩国精品v | 久久久久久久999精品视频| 免费在线观看一区二区| 激情久久久久久久| 欧美日韩第一页| 亚洲国产经典视频| 欧美精品国产精品| 国产欧美一区二区色老头| 美日韩丰满少妇在线观看| 国产精品99久久久久久白浆小说| 国产精品国产亚洲精品看不卡15 | 中文一区二区| 99伊人成综合| 中文亚洲欧美| 亚洲欧美日韩在线观看a三区| 亚洲精品日本| 亚洲天堂av在线免费观看| 亚洲图片自拍偷拍| 午夜综合激情| 久久先锋资源| 欧美三日本三级三级在线播放| 国产精品海角社区在线观看| 国产欧美三级| 亚洲国产欧美不卡在线观看| 亚洲精品婷婷| 一区二区在线看|