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

設(shè)計模式結(jié)構(gòu)型——享元模式

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

目錄

什么是享元模式

享元模式的實現(xiàn)

享元模式角色

享元模式類圖

享元模式代碼實現(xiàn)

享元模式的特點

優(yōu)點

缺點

使用場景

注意事項


什么是享元模式

????????享元模式(Flyweight Pattern)是一種結(jié)構(gòu)型設(shè)計模式,享元模式中的“享元”指被共享的單元,享元模式通過復(fù)用對象,以達到節(jié)省內(nèi)存的目的。要求能夠共享的對象必須是細(xì)粒度對象,因此它又稱為輕量級模式。其主要解決的問題是創(chuàng)建大量相似對象時的內(nèi)存開銷過大。

????????其意圖運用共享技術(shù)有效地支持大量細(xì)粒度的對象。解決在有大量對象時,有可能會造成內(nèi)存溢出問題,把其中共同的部分抽象出來,查找時直接返回在內(nèi)存中已有的對象,沒有才重新創(chuàng)建,避免重新創(chuàng)建已有對象。減少創(chuàng)建對象的數(shù)量,以減少內(nèi)存占用和提高性能,避免大量相似對象的開銷,從而提高系統(tǒng)資源的利用率,盡可能復(fù)用現(xiàn)有的同類對象。

????????“享元”,被共享的單元,即復(fù)用對象,節(jié)省內(nèi)存,注意前提是享元對象是不可變對象。

????????當(dāng)一個系統(tǒng)中存在大量重復(fù)不可變對象,就能利用享元模式將對象設(shè)計成享元,在內(nèi)存中只保留一份實例,供引用。這就減少內(nèi)存中對象的數(shù)量,最終節(jié)省內(nèi)存。當(dāng)然,不僅相同對象可設(shè)計成享元,相似對象,也能提取對象中的相同部分(字段)設(shè)計成享元。

????????“不可變對象”:一旦通過構(gòu)造器初始化完成后,其狀態(tài)(對象的成員變量或?qū)傩裕┚筒粫俦恍薷摹K?,不可變對象不能暴露任何set()等修改內(nèi)部狀態(tài)的方法。之所以要求享元是不可變對象,是因為它會被多處代碼共享使用,避免一處代碼對享元進行了修改,影響到其他使用它的代碼。

享元模式的實現(xiàn)

享元(Flyweight )模式中存在以下兩種狀態(tài):

1.?內(nèi)部狀態(tài),即不會隨著環(huán)境的改變而改變的可共享部分。

2.?外部狀態(tài),指隨環(huán)境改變而改變的不可以共享的部分。享元模式的實現(xiàn)要領(lǐng)就是區(qū)分應(yīng)用中的這兩種狀態(tài),并將外部狀態(tài)外部化。

享元模式角色

  1. 抽象享元角色(Flyweight):通常是一個接口或抽象類,在抽象享元類中聲明了具體享元類公 共的方法,這些方法可以向外界提供享元對象的內(nèi)部數(shù)據(jù)(內(nèi)部狀態(tài)),同時也可以通過這些方法來設(shè)置外部數(shù)據(jù)(外部狀態(tài))。
  2. 具體享元角色(Concrete Flyweight):實現(xiàn)了抽象享元類,稱為享元對象;在具體享元 類中為內(nèi)部狀態(tài)提供了存儲空間。通常我們可以結(jié)合單例模式來設(shè)計具體享元類,為每一個具體享元類提供唯一的享元對象。
  3. 非享元角色(Unsharable Flyweight) :并非所有的抽象享元類的子類都需要被共享,不 能被共享的子類可設(shè)計為非共享具體享元類;當(dāng)需要一個非共享具體享元類的對象時可以直接通過實例化創(chuàng)建。
  4. 享元工廠角色(Flyweight Factory):負(fù)責(zé)創(chuàng)建和管理享元角色。當(dāng)客戶對象請求一個享元 對象時,享元工廠檢査系統(tǒng)中是否存在符合要求的享元對象,存在則提供給客戶,不存在新創(chuàng)建提供給客戶。

享元模式類圖

設(shè)計模式結(jié)構(gòu)型——享元模式,設(shè)計模式,設(shè)計模式,享元模式

享元模式代碼實現(xiàn)

抽象享元角色

package com.common.demo.pattern.flyweight;

/**
 * @author Evan Walker 昂焱數(shù)據(jù): https://www.ayshuju.com
 * @version 1.0
 * @desc 抽象享元角色 籃球
 * @date 2023/07/21 15:03:57
 */
public interface BasketBall {

    void play();
}

具體享元角色和非享元角色

package com.common.demo.pattern.flyweight;

/**
 * @author Evan Walker 昂焱數(shù)據(jù): https://www.ayshuju.com
 * @version 1.0
 * @desc 具體享元角色 體育館
 * @date 2023/07/21 15:05:37
 */
public class Gymnasium implements BasketBall{

    private String gymnasiumName;

    private String sport = "籃球";

    double price = 50;

    public Gymnasium() {
    }

    public Gymnasium(String gymnasiumName) {
        this.gymnasiumName = gymnasiumName;
    }

    public String getGymnasiumName() {
        return gymnasiumName;
    }

    public void setGymnasiumName(String gymnasiumName) {
        this.gymnasiumName = gymnasiumName;
    }

    public String getSport() {
        return sport;
    }

    public void setSport(String sport) {
        this.sport = sport;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    @Override
    public void play() {
        System.out.println("Gymnasium{" + "gymnasiumName='" + gymnasiumName + '\'' +
                ", sport='" + sport + '\'' + ", price=" + price + '}'
                +", this Object='" + this + '\'' );
    }

}

享元工廠角色

package com.common.demo.pattern.flyweight;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

/**
 * @author Evan Walker 昂焱數(shù)據(jù): https://www.ayshuju.com
 * @version 1.0
 * @desc 享元工廠 籃球工廠
 * @date 2023/07/21 15:11:37
 */
public class BasketBallFactory {

    private static Map<String,Gymnasium> MAP = new HashMap<>();

    public static Gymnasium getBasketBall(String gymnasiumName){
        Gymnasium gymnasium = MAP.get(gymnasiumName);
        if(Objects.isNull(gymnasium)){
            gymnasium = new Gymnasium(gymnasiumName);
            MAP.put(gymnasiumName,gymnasium);
        }
        return gymnasium;
    }
}

測試類

package com.common.demo.pattern.flyweight;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Evan Walker 昂焱數(shù)據(jù): https://www.ayshuju.com
 * @version 1.0
 * @desc
 * @date 2023/07/21 15:16:00
 */
public class Test {

    private static final List<String> nameList = new ArrayList<>();

    public static void main(String[] args) {
        nameList.add("斯塔普斯中心球館");
        nameList.add("大通中心球館");
        nameList.add("麥迪遜花園球館");
        nameList.add("聯(lián)合中心球館");
        nameList.add("速貸中心球館");
        nameList.add("斯塔普斯中心球館");
        nameList.add("速貸中心球館");
        nameList.add("美航球館");
        nameList.add("丹佛百事中心球館");

        for (String name : nameList){
            BasketBallFactory.getBasketBall(name).play();
        }
    }
}

測試截圖

設(shè)計模式結(jié)構(gòu)型——享元模式,設(shè)計模式,設(shè)計模式,享元模式

享元模式的特點

優(yōu)點

  1. 大大減少對象的創(chuàng)建,對象復(fù)用,降低系統(tǒng)的內(nèi)存,使效率提高。

缺點

  1. 提高了系統(tǒng)的復(fù)雜度,需要分離出外部狀態(tài)和內(nèi)部狀態(tài),而且外部狀態(tài)具有固有化的性質(zhì),不應(yīng)該隨著內(nèi)部狀態(tài)的變化而變化,否則會造成線程安全問題。
  2. 需要犧牲一定的時間和空間,來實現(xiàn)對象共享和控制機制。當(dāng)對象之間沒有復(fù)用性時,使用享元模式可能會導(dǎo)致額外的開銷。

使用場景

  1. 系統(tǒng)有大量相似對象。
  2. 當(dāng)對象需要被共享時,如需要緩沖池的場景。
  3. 當(dāng)系統(tǒng)的內(nèi)存資源相對有限時可以考慮使用享元模式,以減少內(nèi)存的使用。
  4. 當(dāng)需要減少對象的創(chuàng)建次數(shù)、降低系統(tǒng)開銷時。

注意事項

  1. 注意劃分外部狀態(tài)和內(nèi)部狀態(tài),否則可能會引起線程安全問題。
  2. 這些類必須有一個工廠對象加以控制。

更多消息資訊,請訪問昂焱數(shù)據(jù)(https://www.ayshuju.com)文章來源地址http://www.zghlxwxcb.cn/news/detail-602384.html

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

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

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

相關(guān)文章

  • 笨蛋學(xué)設(shè)計模式結(jié)構(gòu)型模式-享元模式【13】

    7.7.1概念 ? 享元模式是通過共享對象減少內(nèi)存使用,來提高程序性能。在此模式中,分為內(nèi)部狀態(tài)和外部狀態(tài),其中相似的對象被存儲在享元對象內(nèi)部,并對于所有享元對象都是相同的,且狀態(tài)通常是不變的。只在需要時內(nèi)部共享,而不是每次創(chuàng)建新的對象。而外部狀態(tài)是享

    2024年01月23日
    瀏覽(28)
  • 【十】設(shè)計模式~~~結(jié)構(gòu)型模式~~~享元模式(Java)

    【十】設(shè)計模式~~~結(jié)構(gòu)型模式~~~享元模式(Java)

    【學(xué)習(xí)難度:★★★★☆,使用頻率:★☆☆☆☆】 ????????面向?qū)ο蠹夹g(shù)可以很好地解決一些靈活性或可擴展性問題,但在很多情況下需要在系統(tǒng)中增加類和對象的個數(shù)。當(dāng)對象數(shù)量太多時,將導(dǎo)致運行代價過高,帶來性能下降等問題。 享元模式正是為解決這一類問題

    2024年02月08日
    瀏覽(25)
  • 【結(jié)構(gòu)型設(shè)計模式】C#設(shè)計模式之享元模式

    享元模式(Flyweight Pattern)是一種結(jié)構(gòu)型設(shè)計模式,旨在通過盡可能共享對象來減少內(nèi)存使用和提高性能。它將對象分為兩種類型:內(nèi)部狀態(tài)(Intrinsic State)和外部狀態(tài)(Extrinsic State)。內(nèi)部狀態(tài)是可以共享的,而外部狀態(tài)是獨立于享元對象的,并且在使用時需要注入。 使用

    2024年02月13日
    瀏覽(27)
  • 【設(shè)計模式】第13節(jié):結(jié)構(gòu)型模式之“享元模式”

    【設(shè)計模式】第13節(jié):結(jié)構(gòu)型模式之“享元模式”

    所謂“享元”,顧名思義就是被共享的單元。享元模式的意圖是復(fù)用對象,節(jié)省內(nèi)存,前提是享元對象是不可變對象。 實現(xiàn):通過工廠模式,在工廠類中,通過一個Map或者List來緩存已經(jīng)創(chuàng)建好的享元對象,以達到復(fù)用的目的。把實例的共享狀態(tài)和不共享狀態(tài)分開。 以下是畫

    2024年02月08日
    瀏覽(15)
  • 【Java 設(shè)計模式】結(jié)構(gòu)型之享元模式

    享元模式(Flyweight Pattern)是一種結(jié)構(gòu)型設(shè)計模式,它旨在減少對象的數(shù)量以節(jié)省內(nèi)存和提高性能。享元模式通過共享大量相似對象的狀態(tài),使得這些對象可以共享,而不需要在每個對象中都存儲相同的數(shù)據(jù)。在本文中,我們將深入研究Java中享元模式的定義、結(jié)構(gòu)、使用場景

    2024年01月22日
    瀏覽(29)
  • Java設(shè)計模式之結(jié)構(gòu)型-享元模式(UML類圖+案例分析)

    Java設(shè)計模式之結(jié)構(gòu)型-享元模式(UML類圖+案例分析)

    目錄 一、基本概念 二、UML類圖 三、角色設(shè)計 四、案例分析 4.1、基本實現(xiàn) 4.2、游戲角色 五、總結(jié) 享元模式是一種結(jié)構(gòu)型設(shè)計模式,主要用于減少創(chuàng)建大量相似對象所占用的內(nèi)存,它通過共享技術(shù)來有效支持大量細(xì)粒度的對象。 角色 描述 抽象享元角色 定義出對象的外部狀

    2024年02月16日
    瀏覽(26)
  • 設(shè)計模式--------結(jié)構(gòu)型模式

    設(shè)計模式--------結(jié)構(gòu)型模式

    結(jié)構(gòu)型模式描述如何將類或?qū)ο蟀茨撤N布局組成更大的結(jié)構(gòu)。它分為類結(jié)構(gòu)型模式和對象結(jié)構(gòu)型模式,前者采用繼承機制來組織接口和類,后者釆用組合或聚合來組合對象。 由于組合關(guān)系或聚合關(guān)系比繼承關(guān)系耦合度低,滿足“合成復(fù)用原則”,所以對象結(jié)構(gòu)型模式比類結(jié)構(gòu)

    2024年02月13日
    瀏覽(30)
  • 設(shè)計模式結(jié)構(gòu)型——外觀模式

    設(shè)計模式結(jié)構(gòu)型——外觀模式

    目錄 什么是外觀模式 外觀模式的實現(xiàn) 外觀模式角色 外觀模式舉例 外觀模式類圖 外觀模式代碼實現(xiàn) 外觀模式的特點 優(yōu)點 缺點 注意事項 應(yīng)用場景 總結(jié) ????????外觀模式(Facade Pattern):又叫作門面模式,歸屬于結(jié)構(gòu)型模式。外觀模式定義了提供了定義了一個統(tǒng)一的高層

    2024年02月16日
    瀏覽(25)
  • 結(jié)構(gòu)型設(shè)計模式——橋接模式

    結(jié)構(gòu)型設(shè)計模式——橋接模式

    橋接模式(Bridge pattern): 使用橋接模式通過將實現(xiàn)和抽象放在兩個不同的類層次中而使它們可以獨立改變。 橋接模式 (Bridge) 是一種結(jié)構(gòu)型設(shè)計模式, 可將 抽象 部分與 實現(xiàn) 部分 分離 ,使它們都可以獨立的變化。如果一個系統(tǒng)需要在構(gòu)件的抽象化角色和具體化角色之間增加更

    2024年02月07日
    瀏覽(34)
  • 結(jié)構(gòu)型設(shè)計模式——外觀模式

    結(jié)構(gòu)型設(shè)計模式——外觀模式

    有句話說這個世界就是個草臺班子,只不過排面做的好看而已,里面都是一包糠。這句話來形容外觀模式非常準(zhǔn)確,外觀模式又叫門面模式,顧名思義一個系統(tǒng)我不管你里面有多復(fù)雜有多少屎山代碼,我只要求你提供的接口好用,簡單就行,即門面要有排面!用專業(yè)的話講是

    2024年01月22日
    瀏覽(28)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包