Android設計模式--享元模式

水不激不躍,人不激不奮

一,定義

使用共享對象可有效地支持大量的細粒度的對象

享元模式是對象池的一種實現,用來盡可能減少內存使用量,它適合用于可能存在大量重復對象的場景,來緩存可共享的對象,達到對象共享,避免創建過多對象的效果,這樣一來就可以提升性能,避免內存溢出等。

在享元模式中會建立一個對象容器,在經典的享元模式中該容器為一個Map,它的鍵是享元對象的內部狀態,它的值就是享元對象本身。客戶端程序通過這個內部狀態從享元工廠中獲取享元對象,如果有緩存,則使用緩存對象,否則創建一個享元對象并且存入容器中,這樣一來就避免了創建過多對象的問題。

二,使用場景

1,系統中存在大量的相似對象

2,細粒度的對象都具備較接近的外部狀態,而且內部狀態與環境無關,就是說對象沒有特定身份

3,需要緩沖池的場景

三,角色介紹

Flyweight:享元對象抽象基類或接口

ConcreteFlyweight:具體的享元對象

FlyweightFactory:享元工廠,負責管理享元對象池和創建享元對象

四,使用案例

假設在吃雞游戲中,每局游戲都會有100個玩家參與游戲,所以每局游戲都會創建100個玩家角色,如果一個玩家進行了10局游戲,他的角色就會被創建10次。這樣就會造成頻繁的GC,從而影響性能。如果我們使用享元模式,將玩家的姓名作為key,玩家角色作為value存放在內存中,這樣就不會頻繁的去創建玩家角色,避免造成不必要的資源浪費。

首先,創建一個玩家角色接口作為享元對象抽象接口,該接口定義玩家自己選擇皮膚玩游戲:

public interface Player {/*** 玩游戲* @param skin 自己選擇的皮膚* */void playGame(String skin);
}

然后創建具體的享元對象 :

public class ConcretePlayer implements Player{private String name;public ConcretePlayer(String name) {this.name = name;}@Overridepublic void playGame(String skin) {System.out.println("玩家"+name+"使用"+skin+"角色玩游戲");}
}

最后創建享元工廠:

public class PlayerFactory {private static HashMap<String,Player> map =new HashMap<>();public static Player createPlayer(String name){if(map.get(name)==null){System.out.println("創建新的角色");ConcretePlayer concretePlayer =new ConcretePlayer(name);map.put(name,concretePlayer);return concretePlayer;}else {System.out.println("從緩存中拿取角色");ConcretePlayer player = (ConcretePlayer) map.get(name);return player;}}
}

使用:

Player player = PlayerFactory.createPlayer("N港之王");
player.playGame("紅螳螂");
Player player1 = PlayerFactory.createPlayer("N港之王");
player1.playGame("黃螳螂");
Player player2 = PlayerFactory.createPlayer("N港之王");
player2.playGame("紫螳螂");

輸出:

這樣,即使玩家使用同一角色玩了好多把游戲,都只創建了一次角色,其余的都是從緩存中獲取的

五,總結

享元模式實現比較簡單,但是它的作用在某些場景確實及其重要。它可以大大減少應用程序創建的對象,降低程序內存的占用,增強程序的性能,但它同時也提高了系統的復雜性,需要分離出外部狀態和內部狀態,而且外部狀態具有固化特性,不應該隨內部狀態改變而改變,否則導致系統的邏輯混亂。

享元模式的優點在于它大幅度地降低內存中對象的數量,但是,它做到這一點所付出的代價也是很高的。

享元模式使得系統更加復雜。為了使對象可以共享,需要將一些狀態外部化,這使得程序的邏輯復雜化。

享元模式將享元對象的狀態外部化,而讀取外部狀態使得運行時間稍微變長。

參考文獻:Android源碼設計模式解析與實戰

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/167969.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/167969.shtml
英文地址,請注明出處:http://en.pswp.cn/news/167969.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

騰訊云CVM標準型SA5云服務器AMD EPYC Bergamo處理器

騰訊云服務器標準型SA5實例是最新一代的標準型實例&#xff0c;CPU采用AMD EPYC? Bergamo全新處理器&#xff0c;采用最新DDR5內存&#xff0c;默認網絡優化&#xff0c;最高內網收發能力達4500萬pps。騰訊云百科txybk.com分享騰訊云標準型SA5云服務器CPU、內存、網絡、性能、…

Qt項目打包發布超詳細教程

https://blog.csdn.net/qq_45491628/article/details/129091320

用蘋果簽名免費獲取Xcode

使用蘋果企業簽名免費獲取Xcode&#xff1a; 打開Xcode。連接iOS設備到Mac。選擇Window→Devices and Simulators。選擇該設備。將IPA文件拖到“Installed Apps”的列表框中即可安裝。使用Cydia Impactor&#xff08;可以在網上找到相關下載鏈接&#xff09;&#xff1a; 打開…

HTML網站穩定性狀態監控平臺源碼

這是一款網站穩定性狀態監控平臺源碼&#xff0c;它基于UptimeRobot接口進行開發。當您的網站遇到故障時&#xff0c;該平臺能夠通過郵件或短信通知您。下面是對安裝過程的詳細說明&#xff1a; 安裝步驟 將源碼上傳至您的主機或服務器&#xff0c;并進行解壓操作。 在Uptim…

自動化測試中幾種常見驗證碼的處理方式及如何實現?

UI自動化測試時&#xff0c;需要對驗證碼進行識別處理&#xff0c;有很多方式&#xff0c;每種方式都有自己的特點&#xff0c;以下是一些常用處理方法&#xff0c;僅供參考。 1 去掉驗證碼 從自動化的本質上來講&#xff0c;主要是提升測試效率等&#xff0c;但是為了去研究驗…

【點云surface】 修剪B樣條曲線擬合

1 介紹 Fitting trimmed B-splines&#xff08;修剪B樣條曲線擬合&#xff09;是一種用于對給定的點云數據進行曲線擬合的算法。該算法使用B樣條曲線模型來逼近給定的點云數據&#xff0c;并通過對模型進行修剪來提高擬合的精度和準確性。 B樣條曲線是一種常用的曲線表示方法…

【element優化經驗】el-dialog修改title樣式

目錄 前言 解決之路 1.把默認的這個圖標隱藏&#xff0c;官方的api有這個屬性&#xff1a;showClose值設置false. 2.title插槽定制&#xff1a;左邊定制標題&#xff0c;右邊定制按鈕區域。 3.背景顏色修改&#xff1a;默認title是有padding的需要把它重寫調&#xff0c;然…

基于卷積神經網絡CNN開發構建HAR人類行為識別Human Activity Recognition【完整代碼實踐】

行為識別相關的開發實踐在我們之前的博文中也有過相關的實踐了,感興趣的話可以自行移步閱讀即可:《python實現基于TNDADATASET的人體行為識別》 《UCI行為識別——Activity recognition with healthy older people using a batteryless wearable sensor Data Set》《人體行為…

基于 STM32Cube.AI 的嵌入式人臉識別算法實現

本文介紹了如何使用 STM32Cube.AI 工具開發嵌入式人臉識別算法。首先&#xff0c;我們將簡要介紹 STM32Cube.AI 工具和 STM32F系列單片機的特點。接下來&#xff0c;我們將詳細討論如何使用 STM32Cube.AI 工具鏈和相關庫來進行人臉識別算法的開發和優化。最后&#xff0c;我們提…

Netty實現websocket且實現url傳參的兩種方式(源碼分析)

1、先構建基本的netty框架 再下面的代碼中我構建了一個最基本的netty實現websocket的框架&#xff0c;其他個性化部分再自行添加。 Slf4j public class TeacherServer {public void teacherStart(int port) throws InterruptedException {NioEventLoopGroup boss new NioEve…

Day40力扣打卡

打卡記錄 包子湊數&#xff08;裴蜀定理 DP&#xff09; 根據裴蜀定理&#xff0c;存在 c gcd(a, b) 使不定方程ax by c滿足條件&#xff0c;如果gcd(a, b) 1即a與b互素的情況下&#xff0c;就會 ax by 1&#xff0c;由于為1可以構造后面的無窮數字&#xff0c;故得到結…

Centos7 離線安裝 CDH7.1.7

1. 安裝CDH的準備工作&#xff08;所有節點都要執行&#xff09; 1.1 準備環境 角色 IP k8s-master 192.168.181.129 k8s-node1 192.168.181.130 k8s-node2 192.168.181.131 1.2 安裝JDK # https://www.oracle.com/java/technologies/downloads/#java11 wget rpm -ivh…

亞馬遜Listing怎么寫!親身經驗分享

亞馬遜運營的重要環節之一&#xff0c;listing的攥寫&#xff0c;可以決定了產品的搜索排名&#xff0c;用戶的點擊率和轉化率&#xff0c;那么如果你的產品排名或者轉化不理想的情況&#xff0c;可以考慮對listing進行優化&#xff0c;在關鍵詞過多和語句流程通順的情況下&…

js獲取時間日期

目錄 Date 對象 1. 獲取當前時間 2. 獲取特定日期時間 Date 對象的方法 1. 獲取各種日期時間組件 2. 獲取星期幾 3. 獲取時間戳 格式化日期時間 1. 使用 toLocaleString() 方法 2. 使用第三方庫 UNIX 時間戳 內部表示 時區 Date 對象 JavaScript中內置的 Date 對象…

數據挖掘之PCA-主成分分析

PCA的用處&#xff1a;找出反應數據中最大變差的投影&#xff08;就是拉的最開&#xff09;。 在減少需要分析的指標同時&#xff0c;盡量減少原指標包含信息的損失&#xff0c;以達到對所收集數據進行全面分析的目的 但是什么時候信息保留的最多呢&#xff1f;具體一點&#…

?飛凌嵌入式FCU2601網關,為工商業儲能EMS注入智慧的力量

一、火熱的儲能行業&#xff0c;尋求新的市場機會 最近一段時間以來&#xff0c;世界儲能大會、上海儲能展、能源電子產業發展大會等多個儲能相關論壇和展覽密集登場&#xff0c;即使“內卷”已成為了業內討論的熱詞&#xff0c;但尋求新的市場機會仍然是行業共識&#xff0c;…

常用Redis的鍵命令參考

一、DEL DEL key [key …] 刪除給定的一個或多個 key 。 不存在的 key 會被忽略。 #刪除單個鍵127.0.0.1:6379> set name zhangsan OK 127.0.0.1:6379> del name (integer) 1# 刪除一個不存在的 key&#xff0c; 失敗&#xff0c;沒有 key 被刪除127.0.0.1:6379> E…

Qt C++中調用python,并將軟件打包發布,python含第三方依賴

工作中遇到qt c調用我的python 代碼&#xff0c;并且想要一鍵打包&#xff0c;這里我根據參考的以及個人實踐的結果來簡單實現一下。 環境&#xff1a;windows系統&#xff0c;QT Creater 4.5&#xff0c; python 3.8&#xff08;anaconda虛擬環境&#xff09; 1. 簡單QT調用…

【 Kubernetes 風云錄 】- Istio 應用多版本流量控制

文章目錄 原理實現DeploymentVirtualServiceDestinationRule 約束部署 目的: 根據不同的引擎版本&#xff0c;可以把請求發送到指定的引擎上。可以實現版本降級。 原理 Istio通過VirtualService和DestinationRule兩個資源對象來實現流量管理&#xff0c;其中VirtualService用于…

LeetCode Hot100 98.驗證二叉搜索樹

題目&#xff1a; 給你一個二叉樹的根節點 root &#xff0c;判斷其是否是一個有效的二叉搜索樹。 有效 二叉搜索樹定義如下&#xff1a; 節點的左子樹只包含 小于 當前節點的數。節點的右子樹只包含 大于 當前節點的數。所有左子樹和右子樹自身必須也是二叉搜索樹。 方法一…