国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

軟件設(shè)計模式系列之十三——享元模式

這篇具有很好參考價值的文章主要介紹了軟件設(shè)計模式系列之十三——享元模式。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1 模式的定義

享元模式(Flyweight Pattern)是一種結(jié)構(gòu)型設(shè)計模式,它旨在減少內(nèi)存占用或計算開銷,通過共享大量細粒度對象來提高系統(tǒng)的性能。這種模式適用于存在大量相似對象實例,但它們的狀態(tài)可以外部化(extrinsic),并且可以在多個對象之間共享的情況。

2 舉例說明

為了更好地理解享元模式,讓我們舉一些現(xiàn)實生活中的例子。

咖啡店的咖啡杯和碟子的例子。在咖啡店中,咖啡杯和碟子通常具有相同的設(shè)計和形狀,但它們可能具有不同的顏色或圖案??Х鹊昕梢允褂孟碓J絹砉蚕硐嗤O(shè)計的杯子和碟子,以減少存儲和管理的成本。
軟件設(shè)計模式系列之十三——享元模式

公共交通卡的例子。城市中的公共交通卡(如地鐵卡、公共汽車卡)通常具有相同的功能和外觀,但每張卡可能包含不同的余額和個人信息。這些卡可以被視為享元對象,公共交通系統(tǒng)可以共享卡的通用功能。

電子書閱讀器的字體和樣式的例子。電子書閱讀器可以使用享元模式來管理字體、字號和樣式。多本電子書可以共享相同的字體和樣式設(shè)置,以提供一致的閱讀體驗。

這些例子都涉及到具有相似屬性和功能的對象,它們可以通過享元模式來共享通用部分,從而減少資源消耗并提高效率。這在設(shè)計和生產(chǎn)中可以節(jié)省時間和成本。

3 結(jié)構(gòu)

享元模式的結(jié)構(gòu)包括以下主要組件:
軟件設(shè)計模式系列之十三——享元模式

享元工廠(Flyweight Factory):享元工廠負責創(chuàng)建和管理享元對象。它維護一個享元池,其中包含已經(jīng)創(chuàng)建的享元對象,并根據(jù)客戶端請求共享已經(jīng)存在的對象或創(chuàng)建新的享元對象。

享元接口(Flyweight Interface):享元接口是享元對象的抽象,通常聲明了享元對象的公共方法,以便客戶端能夠訪問和操作享元對象。

具體享元(Concrete Flyweight):具體享元是享元接口的實現(xiàn),包含了內(nèi)部狀態(tài)和外部狀態(tài)。內(nèi)部狀態(tài)是可以被共享的,而外部狀態(tài)是不可共享的,它在運行時傳遞給享元對象。

客戶端(Client):客戶端是使用享元模式的應(yīng)用程序或模塊,它通過享元工廠來獲取或共享享元對象,并根據(jù)需要傳遞外部狀態(tài)。

4 實現(xiàn)步驟

要實現(xiàn)享元模式,可以按照以下步驟進行操作:

確定內(nèi)部狀態(tài)和外部狀態(tài):首先,確定對象的內(nèi)部狀態(tài)和外部狀態(tài)。內(nèi)部狀態(tài)是可以被多個對象共享的部分,而外部狀態(tài)是不可共享的。

創(chuàng)建享元接口:定義享元接口,聲明享元對象的公共方法,包括操作內(nèi)部狀態(tài)和外部狀態(tài)的方法。

創(chuàng)建具體享元類:實現(xiàn)具體享元類,它包含了內(nèi)部狀態(tài)和外部狀態(tài)的具體實現(xiàn)。內(nèi)部狀態(tài)可以在多個對象之間共享,而外部狀態(tài)需要在運行時傳遞。

創(chuàng)建享元工廠:創(chuàng)建享元工廠,負責創(chuàng)建和管理享元對象。享元工廠可以維護一個享元池,用于存儲已經(jīng)創(chuàng)建的享元對象。

客戶端使用享元對象:在客戶端中,通過享元工廠來獲取或共享享元對象。客戶端需要提供外部狀態(tài)作為參數(shù),并根據(jù)需要操作享元對象。

5 代碼實現(xiàn)

以下是一個簡單的 Java 代碼示例,演示了如何使用享元模式來實現(xiàn)公共交通卡的共享功能。在這個示例中,我們創(chuàng)建了一個 TransportCardFactory 工廠類來管理交通卡對象,以及一個 TransportCard 接口表示交通卡。

// 1. 定義交通卡接口
interface TransportCard {
    void swipe();
}

// 2. 創(chuàng)建具體的交通卡類
class SubwayCard implements TransportCard {
    private String ownerName;
    private int balance;

    public SubwayCard(String ownerName) {
        this.ownerName = ownerName;
        this.balance = 0;
    }

    public void swipe() {
        System.out.println("刷地鐵卡,扣除票價,余額:" + balance);
    }
}

// 3. 創(chuàng)建享元工廠類
class TransportCardFactory {
    private Map<String, TransportCard> cards = new HashMap<>();

    public TransportCard getCard(String ownerName) {
        if (cards.containsKey(ownerName)) {
            System.out.println("使用現(xiàn)有的交通卡:" + ownerName);
            return cards.get(ownerName);
        } else {
            System.out.println("創(chuàng)建新的交通卡:" + ownerName);
            TransportCard card = new SubwayCard(ownerName);
            cards.put(ownerName, card);
            return card;
        }
    }
}

// 4. 客戶端代碼
public class Client {
    public static void main(String[] args) {
        TransportCardFactory cardFactory = new TransportCardFactory();

        // 乘客1刷卡
        TransportCard card1 = cardFactory.getCard("zhanngsan");
        card1.swipe();

        // 乘客2刷卡
        TransportCard card2 = cardFactory.getCard("lisi");
        card2.swipe();

        // 再次刷卡
        TransportCard card3 = cardFactory.getCard("zhanngsan");
        card3.swipe();
    }
}

在這個示例中,我們首先定義了 TransportCard 接口,表示交通卡的通用功能。然后,我們創(chuàng)建了一個具體的交通卡類 SubwayCard,它實現(xiàn)了 TransportCard 接口,并包含了特定于地鐵卡的屬性。

接下來,我們創(chuàng)建了享元工廠類 TransportCardFactory,它負責管理和共享交通卡對象。當客戶端需要一個交通卡時,工廠類會首先檢查是否已經(jīng)存在具有相同擁有者姓名的卡,如果存在則返回現(xiàn)有的卡,否則創(chuàng)建一個新的卡對象。

最后,我們在客戶端代碼中演示了如何使用享元模式,創(chuàng)建并刷卡,觀察到當兩位乘客使用相同姓名刷卡時,會共享同一個交通卡對象,從而減少了卡對象的創(chuàng)建和內(nèi)存占用。

6 典型應(yīng)用場景

6.1 享元模式通常在以下情況下得到廣泛應(yīng)用

軟件設(shè)計模式系列之十三——享元模式

  • 大量對象。當系統(tǒng)中存在大量相似對象實例時,使用享元模式可以顯著減少內(nèi)存占用,因為相似對象的內(nèi)部狀態(tài)可以共享。

  • 內(nèi)部狀態(tài)與外部狀態(tài)。當對象可以分為內(nèi)部狀態(tài)和外部狀態(tài)時,享元模式特別有用。內(nèi)部狀態(tài)是對象的固定部分,可以被多個對象共享,而外部狀態(tài)是對象的可變部分,每個對象可以根據(jù)需要個性化。

  • 性能優(yōu)化。在需要高性能和低內(nèi)存消耗的情況下,享元模式可以用于共享重復(fù)使用的對象,從而提高系統(tǒng)的性能。

  • 緩存管理。在需要緩存大量對象以提高系統(tǒng)響應(yīng)時間的情況下,可以使用享元模式來管理緩存對象。

  • 資源池管理。當需要管理共享資源池(如數(shù)據(jù)庫連接池、線程池)中的資源對象時,享元模式可以用于有效地共享和重用資源。

享元模式在需要管理大量相似對象、共享內(nèi)部狀態(tài)、提高性能和減少內(nèi)存占用的情況下非常有用。它允許對象在不同上下文中共享內(nèi)部狀態(tài),而外部狀態(tài)可以根據(jù)需要進行個性化定制。通過合理使用享元模式,可以改善系統(tǒng)的效率和資源利用率。

6.2 java中的字符串應(yīng)用享元模式場景

在Java中,字符串是使用享元模式的經(jīng)典示例。享元模式的核心思想是共享相似對象的內(nèi)部狀態(tài),以減少內(nèi)存占用。字符串的使用正是基于這個思想。

下面是Java中字符串如何使用享元模式的一些關(guān)鍵特點:

不可變性:Java中的字符串是不可變的,也就是說一旦創(chuàng)建了一個字符串對象,它的值就不能被修改。這意味著如果兩個字符串具有相同的字符序列,它們可以共享相同的內(nèi)部字符數(shù)組。

字符串常量池:Java維護了一個字符串常量池(String Pool),用于存儲字符串字面量。當你創(chuàng)建一個字符串字面量時,Java會首先檢查常量池中是否已經(jīng)存在相同值的字符串。如果存在,它將返回常量池中的字符串引用,而不會創(chuàng)建新的對象。

共享相同的字符串對象:由于字符串的不可變性和字符串常量池的存在,多個字符串變量可以共享相同的字符串對象。這意味著如果你有多個字符串變量引用相同的字符串值,它們實際上共享同一個字符串對象。

下面是一個示例,演示了字符串如何使用享元模式:

String s1 = "Hello"; // 創(chuàng)建一個字符串字面量,存儲在常量池中
String s2 = "Hello"; // 與s1共享相同的字符串對象

String s3 = new String("Hello"); // 創(chuàng)建一個新的字符串對象,不存儲在常量池中
String s4 = new String("Hello"); // 創(chuàng)建另一個新的字符串對象,也不存儲在常量池中

System.out.println(s1 == s2); // true,s1和s2共享相同的字符串對象
System.out.println(s1 == s3); // false,s1和s3引用不同的字符串對象

在上面的示例中,s1 和 s2 共享相同的字符串對象,因為它們引用相同的字符串字面量,而 s3 和 s4 創(chuàng)建了新的字符串對象,因為它們使用了 new 操作符。這種共享內(nèi)部狀態(tài)的方式減少了內(nèi)存占用,并提高了性能,特別是當處理大量字符串時。

Java中的字符串是一個典型的享元模式的例子,通過不可變性和字符串常量池,它實現(xiàn)了字符串對象的共享,以減少內(nèi)存占用和提高性能。這種設(shè)計對于處理字符串操作非常高效,并且保證了字符串值的安全性,因為它們不可被修改。

7 優(yōu)缺點

享元模式具有一些優(yōu)點和缺點,讓我們來看看:

優(yōu)點:

減少內(nèi)存占用,享元模式通過共享相似對象的內(nèi)部狀態(tài),可以大大減少內(nèi)存占用,提高系統(tǒng)的性能和效率。提高性能,通過共享對象,減少了對象的創(chuàng)建和銷毀,從而提高了系統(tǒng)的性能。分離內(nèi)部狀態(tài)和外部狀態(tài),享元模式允許將內(nèi)部狀態(tài)和外部狀態(tài)分開,外部狀態(tài)可以在運行時傳遞給享元對象,使系統(tǒng)更靈活。

缺點:

增加復(fù)雜性,享元模式引入了共享對象和外部狀態(tài)的概念,可能增加了系統(tǒng)的復(fù)雜性??赡軐?dǎo)致線程安全問題,如果多個線程同時訪問共享對象并修改其外部狀態(tài),可能會導(dǎo)致線程安全問題。

8 類似模式

享元模式通常與其他設(shè)計模式一起使用,以解決更復(fù)雜的問題或?qū)崿F(xiàn)更全面的系統(tǒng)。以下是一些常見的設(shè)計模式,以及如何與享元模式一起使用它們。

工廠模式。享元模式通常需要一個工廠來創(chuàng)建和管理共享對象。你可以使用工廠模式來創(chuàng)建享元對象,確保對象的創(chuàng)建和初始化過程是封裝的,并且客戶端不需要直接創(chuàng)建對象。

單例模式。在享元模式中,享元工廠可以是一個單例,以確保只有一個享元工廠實例用于管理共享對象。這樣可以確保對象的唯一性和一致性。

裝飾者模式:裝飾者模式可以與享元模式一起使用,以動態(tài)地添加功能或狀態(tài)到享元對象。裝飾者模式允許你在不改變對象結(jié)構(gòu)的情況下,為對象添加額外的行為。

代理模式:代理模式可以與享元模式一起使用,以提供對享元對象的訪問控制或延遲加載。代理可以用于監(jiān)控或限制對共享對象的訪問。

組合模式:組合模式用于將對象組織成樹形結(jié)構(gòu),享元模式可以用于共享組合中的相似對象,以減少內(nèi)存占用。這在圖形和圖像處理應(yīng)用中特別有用。

享元模式可以與許多其他設(shè)計模式一起使用,具體取決于系統(tǒng)的需求。它通常與創(chuàng)建型模式(如工廠模式、單例模式)和結(jié)構(gòu)型模式(如裝飾者模式、代理模式)結(jié)合使用,以實現(xiàn)更靈活、高效和可維護的系統(tǒng)。在實際應(yīng)用中,將多種模式結(jié)合使用可以更好地滿足復(fù)雜系統(tǒng)的需求。

9 小結(jié)

享元模式是一種有助于減少內(nèi)存占用和提高系統(tǒng)性能的結(jié)構(gòu)型設(shè)計模式。通過共享大量細粒度的對象,它可以有效地降低系統(tǒng)的資源消耗,特別適用于存在大量相似對象的場景。在設(shè)計和開發(fā)中,當需要創(chuàng)建大量相似對象時,可以考慮使用享元模式以提高系統(tǒng)的效率和性能。這種模式的核心思想是將對象的內(nèi)部狀態(tài)與外部狀態(tài)分離,從而實現(xiàn)對象的共享和復(fù)用。文章來源地址http://www.zghlxwxcb.cn/news/detail-710057.html

到了這里,關(guān)于軟件設(shè)計模式系列之十三——享元模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 軟件設(shè)計模式系列之十二——外觀模式

    軟件設(shè)計模式系列之十二——外觀模式

    在軟件設(shè)計中,經(jīng)常會遇到需要與復(fù)雜子系統(tǒng)進行交互的情況。為了簡化客戶端與子系統(tǒng)之間的交互,提高系統(tǒng)的可維護性和可用性,外觀模式應(yīng)運而生。外觀模式(Facade Pattern)是一種結(jié)構(gòu)型設(shè)計模式,它提供一個統(tǒng)一的界面,用于訪問系統(tǒng)中的一組相關(guān)接口,從而隱藏了

    2024年02月08日
    瀏覽(23)
  • 軟件設(shè)計模式系列之十八——迭代器模式

    軟件設(shè)計模式系列之十八——迭代器模式

    迭代器模式是一種行為型設(shè)計模式,它允許客戶端逐個訪問一個聚合對象中的元素,而不暴露該對象的內(nèi)部表示。迭代器模式提供了一種統(tǒng)一的方式來遍歷不同類型的集合,使客戶端代碼更加簡潔和可復(fù)用。 為了更好地理解迭代器模式,讓我們考慮一個簡單的例子:一個圖書

    2024年02月08日
    瀏覽(24)
  • 軟件設(shè)計模式系列之十五——職責鏈模式

    軟件設(shè)計模式系列之十五——職責鏈模式

    職責鏈模式(Chain of Responsibility Pattern)也稱為責任鏈模式,是一種結(jié)構(gòu)型設(shè)計模式,用于構(gòu)建一條對象處理請求的責任鏈。在這個模式中,多個對象依次處理請求,直到其中一個對象能夠處理該請求為止。職責鏈模式將請求的發(fā)送者和接收者解耦,允許多個對象都有機會處理

    2024年02月08日
    瀏覽(24)
  • 軟件設(shè)計模式系列之十七——解釋器模式

    軟件設(shè)計模式系列之十七——解釋器模式

    解釋器模式是一種行為型設(shè)計模式,它用于將一種語言或表達式解釋為對象。該模式通過定義語言的文法規(guī)則,并使用解釋器來解釋和執(zhí)行這些規(guī)則,將復(fù)雜的語言轉(zhuǎn)換為對象的操作。 在軟件開發(fā)中,解釋器模式常用于處理類似于編程語言、查詢語言、正則表達式等需要解釋

    2024年02月08日
    瀏覽(25)
  • 軟件設(shè)計模式系列之十九——中介者模式

    軟件設(shè)計模式系列之十九——中介者模式

    @ 目錄 1 模式的定義 2 舉例說明 3 結(jié)構(gòu) 4 實現(xiàn)步驟 5 代碼實現(xiàn) 6 典型應(yīng)用場景 7 優(yōu)缺點 8 類似模式 9 小結(jié) 中介者模式是一種行為型設(shè)計模式,它用于降低對象之間的直接通信,通過引入一個中介者對象來管理對象之間的交互。這種模式有助于減少對象之間的耦合性,使系統(tǒng)更

    2024年02月08日
    瀏覽(16)
  • 二十三種設(shè)計模式第十三篇--享元模式

    二十三種設(shè)計模式第十三篇--享元模式

    享元模式,主要就是一種池化方案,主要用于創(chuàng)建對象的數(shù)量,以減少內(nèi)存占用和提高性能。這種類型的設(shè)計模式屬于 結(jié)構(gòu)型模式 ,它提供了減少對象數(shù)量從而改善應(yīng)用所需的對象結(jié)構(gòu)的方式。 享元模式,嘗試重用現(xiàn)有的同類對象,如果未找到相同匹配的對象,那么就去創(chuàng)

    2024年02月12日
    瀏覽(17)
  • 軟件設(shè)計模式系列之二十三——策略模式

    軟件設(shè)計模式系列之二十三——策略模式

    策略模式(Strategy Pattern)是一種行為型設(shè)計模式,它允許在運行時動態(tài)選擇算法的行為。這意味著你可以定義一系列算法,將它們封裝成獨立的策略對象,然后根據(jù)需要在不修改客戶端代碼的情況下切換這些算法。策略模式有助于解決問題領(lǐng)域中不同行為的變化和擴展,同時

    2024年02月08日
    瀏覽(21)
  • 軟考高級系統(tǒng)架構(gòu)設(shè)計師系列論文八十三:論軟件設(shè)計模式的應(yīng)用

    軟考高級系統(tǒng)架構(gòu)設(shè)計師系列之:面向構(gòu)件的軟件設(shè)計,構(gòu)件平臺與典型架構(gòu)

    2024年02月11日
    瀏覽(165)
  • Java 設(shè)計模式系列:享元模式

    Java 設(shè)計模式系列:享元模式

    享元模式(Flyweight Pattern)是一種軟件設(shè)計模式,用于減少內(nèi)存使用和提高性能。它通過共享細粒度對象來減少創(chuàng)建和銷毀對象時所需的內(nèi)存。享元模式適用于大量相似對象的場景,這些對象可以共享相同的狀態(tài)和行為。 享元模式的核心思想是將對象分為內(nèi)部狀態(tài)和外部狀態(tài)

    2024年04月15日
    瀏覽(39)
  • 軟件設(shè)計模式(四):觀察者、組合、享元模式

    軟件設(shè)計模式(四):觀察者、組合、享元模式

    在這篇文章中,荔枝將會梳理軟件設(shè)計模式中有關(guān)觀察者模式、組合模式和享元模式的內(nèi)容。其中組合模式和享元模式比較簡單,重點需要理解觀察者模式的機制以及為什么該模式實現(xiàn)了對象之間的松耦合。希望荔枝的梳理能對需要的小伙伴有幫助~~~ 前言 一、觀察者模式O

    2024年02月09日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包