java設計模式(十二)享元模式(Flyweight Pattern)

1、模式介紹:

????????享元模式是一種結構型設計模式,旨在通過共享對象來有效支持大量細粒度的對象。它通過將對象的狀態分為內部狀態(可共享)和外部狀態(不可共享)來減少內存消耗和提高性能。內部狀態存儲在享元對象內部,而外部狀態則由客戶端代碼管理和傳遞。

2、應用場景:

????????對象池:當程序中存在大量相似對象且不需要區分其具體身份時,可以使用享元模式。比如線程池、連接池等。
????????文本編輯器:對于每一個字符或者格式化文本片段,如果存在大量相同的文本片段,可以共享相同的內部狀態,減少內存消耗。
????????游戲開發:在游戲中,大量的角色或者粒子對象可能具有相同的外觀和行為,可以通過享元模式來節省資源。
????????字符串常量池:Java中的字符串常量池就是享元模式的一個實際應用,相同的字符串常量在內存中只存儲一份,多個字符串變量可以共享同一個常量。

3、優點:

????????減少內存消耗:通過共享相同的對象實例,減少內存使用。
????????提高性能:減少了創建對象的時間,特別是在對象頻繁被創建和銷毀的場景下。

4、缺點:

????????可能引入額外的復雜性:需要對內部狀態和外部狀態進行區分和管理,可能增加系統的復雜度。
????????需要合理劃分內部狀態和外部狀態:不正確的劃分可能導致系統的邏輯混亂。

5、代碼實現:

/*** 享元接口** @author FM_南風* @date 2024/6/27*/
public interface FlyweightInterface {//繪畫方法void draw();
}/*** 享元實現類** @author FM_南風* @date 2024/6/27*/
@Data
public class FlyweightClass implements FlyweightInterface{private final String color; // 顏色private int x, y, radius; // 坐標半徑public FlyweightClass(String color) {this.color = color;}@Overridepublic void draw() {System.out.println("享元實現類: 繪畫 [Color : " + color+ ", x : " + x + ", y :" + y + ", radius :" + radius);}
}/*** 享元工廠** @author FM_南風* @date 2024/6/27*/
public class FlyweightFactory {private static final Map<String, FlyweightInterface> flyweightMap = new HashMap<>();public static FlyweightInterface getCircle(String color) {FlyweightClass flyweightClass = (FlyweightClass) flyweightMap.get(color);if (flyweightClass == null) {flyweightClass = new FlyweightClass(color);flyweightMap.put(color, flyweightClass);System.out.println("開始創作: " + color);}return flyweightClass;}
}/*** 應用** @author FM_南風* @date 2024/6/27*/
public class FlyweightClient {private static final String[] colors = {"紅", "綠", "藍"};public static void main(String[] args) {for (int i = 0; i < 20; ++i) {FlyweightClass circle = (FlyweightClass) FlyweightFactory.getCircle(getRandomColor());circle.setX(getRandomX());circle.setY(getRandomY());circle.setRadius(100);circle.draw();}}private static String getRandomColor() {return colors[(int) (Math.random() * colors.length)];}private static int getRandomX() {return (int) (Math.random() * 100);}private static int getRandomY() {return (int) (Math.random() * 100);}
}

6、結果展示:

7、代碼示例說明:

在這個示例中:FlyweightClass類作為具體享元類,顏色(內部狀態)color?是享元的一部分,而 x、y、raidus則是外部狀態。
FlyweightFactory?類作為享元工廠,負責管理和提供享元對象。享元對象在首次創建時存儲在 flyweightMap?中,以便于后續共享使用。
FlyweightClient類作為客戶端代碼,演示如何使用享元模式來創建和繪制多個圓形對象,共享相同的顏色。
通過享元模式,可以看到多個具有相同顏色的圓形對象共享同一個 FlyweightClass 實例,從而減少了對象的創建和內存消耗。

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

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

相關文章

蘇東坡傳-讀書筆記九

我們論到蘇東坡&#xff0c;我們就不能避免“氣”這個字。因為每個文學批評家綜括蘇東坡的個性&#xff0c;必用孟子所說的這個“氣”字。 在《孟子》里&#xff0c;“氣”是哲學的概念&#xff0c;類似柏格森所說的“生氣勃勃”&#xff0c;是人格上的“元氣”。使偉人和匹夫顯…

419. 甲板上的戰艦

419. 甲板上的戰艦 題目鏈接&#xff1a;419. 甲板上的戰艦 代碼如下&#xff1a; class Solution { public:int countBattleships(vector<vector<char>>& board) {int res0;int rowboard.size(),colboard[0].size();for(int i0;i<row;i){for(int j0;j&l…

深度學習中的Logits處理:InvalidScoreLogitsProcessor詳解

深度學習中的Logits處理&#xff1a;InvalidScoreLogitsProcessor詳解 基礎概念InvalidScoreLogitsProcessor為什么需要這個處理器&#xff1f;使用示例進階&#xff1a;自定義LogitsProcessor結論 在自然語言處理(NLP)任務中,特別是在使用大型語言模型(LLM)進行文本生成時,我們…

【 2024!深入了解 大語言模型(LLM)微調方法(總結)】

引言 眾所周知&#xff0c;大語言模型(LLM)正在飛速發展&#xff0c;各行業都有了自己的大模型。其中&#xff0c;大模型微調技術在此過程中起到了非常關鍵的作用&#xff0c;它提升了模型的生成效率和適應性&#xff0c;使其能夠在多樣化的應用場景中發揮更大的價值。 那么&…

《C++20設計模式》橋接模式經驗分享

文章目錄 一、前言二、探討一個類有多個抽象父類的情況&#xff08;為什么會有橋接&#xff09;三、橋接模式3.1 UML類圖3.2 實現 四、最后 一、前言 怎么判斷你是否理解橋接模式了呢&#xff1f;&#x1f9d0; 試著回答下面這個問題吧&#xff01;&#x1f60b; 橋接模式到底…

Current request is not a multipart request

看了許多博客的解決方法&#xff0c;感覺還是不太懂&#xff0c;看了這個解決了問題。 從源碼角度詳細解析

【數據庫】范式

文章目錄 1. 第一范式&#xff08;1NF&#xff09;2. 第二范式&#xff08;2NF&#xff09;3. 第三范式&#xff08;3NF&#xff09;4. 巴斯-科德范式&#xff08;BCNF&#xff09;5. 第四范式&#xff08;4NF&#xff09;6. 第五范式&#xff08;5NF&#xff0c;又稱完美范式&…

heic格式轉化jpg有沒有免費軟件?2024年頂尖的7款heic轉jpg工具請收好!

heic格式轉化jpg有沒有免費軟件&#xff1f;heic格式雖然在分辨率上優于jpg&#xff0c;但由于并非所有設備的默認圖片格式&#xff0c;許多用戶并不太喜歡它。這并不奇怪&#xff0c;因為在非蘋果設備上打開HEIC文件可能會遇到困難。因此&#xff0c;人們更傾向于尋找能夠免費…

FlinkSQL 開發經驗分享

作者&#xff1a;湯包 最近做了幾個實時數據開發需求&#xff0c;也不可避免地在使用 Flink 的過程中遇到了一些問題&#xff0c;比如數據傾斜導致的反壓、interval join、開窗導致的水位線失效等問題&#xff0c;通過思考并解決這些問題&#xff0c;加深了我對 Flink 原理與機…

監控與安全服務

kali 系統 nmap掃描 網段的掃描 使用腳本掃描 使用john破解密碼 哈希算法是一種單向加密的算法&#xff0c;也就是將原始數據生成一串“亂碼”只能通過原始數據&#xff0c;生成這串“亂碼”&#xff0c;但是不能通過“亂碼”回推出原始數據相同的原始數據&#xff0c;生成的亂…

sql優化-單表優化

文章目錄 0、索引優化原則1、在docker內部連接mysql2、數據準備3、創建表 dept 和 emp4、插入50萬數據到 emp 表中4.1、創建函數4.2、存儲過程4.3、調用存儲過程 5、查找姓名以"abc"開頭的員工信息5.1、執行計劃 select * from emp where name like abc%;5.2、sql優化…

React+TS前臺項目實戰(二十四)-- 全局常用繪制組件Qrcode封裝

文章目錄 前言Qrcode組件1. 功能分析2. 代碼詳細注釋3. 使用方式4. 效果展示(pc端 / 移動端) 總結 前言 今天要封裝的Qrcode 組件&#xff0c;是通過傳入的信息&#xff0c;繪制在二維碼上&#xff0c;可用于很多場景&#xff0c;如區塊鏈項目中的區塊顯示交易地址時就可以用到…

無線領夾麥克風哪個品牌好,推薦口碑最好的麥克風品牌

在5G網絡普及的浪潮下&#xff0c;短視頻平臺的興起帶動了一股全民創作的熱潮。無論是城市街頭還是鄉間小徑&#xff0c;人們紛紛拿起手機&#xff0c;記錄生活中的點點滴滴。領夾式麥克風憑借其精準的拾音特性和穩定的信號傳輸&#xff0c;無論是在靜止狀態還是在移動過程中&a…

Android什么是OSD層圖形?

在Android開發中&#xff0c;OSD&#xff08;On-Screen Display&#xff09;層圖形指的是在屏幕上直接顯示特定信息的技術&#xff0c;這些信息可以是文字、圖標、進度條等&#xff0c;主要用于展示應用程序狀態、提示信息、操作指引等。從技術難點、面試官關注點以及回答吸引力…

制作一個靜態庫

1. 準備工作 # 目錄結構 add.c div.c mult.c sub.c -> 算法的源文件, 函數聲明在頭文件 head.h # main.c中是對接口的測試程序, 制作庫的時候不需要將 main.c 算進去 . ├── add.c ├── div.c ├── include │ └── head.h ├── main.c ├── mult.c └── s…

Node.js適合什么場景下使用

Node.js是一個基于Chrome V8 JavaScript引擎構建的開源運行時環境&#xff0c;它允許開發者使用JavaScript在服務器端運行代碼。Node.js具有高性能、輕量級、事件驅動和非阻塞I/O等特性&#xff0c;這些特性使得它在多種場景下具有廣泛的應用。以下是Node.js適合使用的幾個主要…

Protocol Buffers 協議 .proto 文件的編寫指南及注意事項

Protocol Buffers&#xff08;簡稱protobuf&#xff09;是Google提供的一種數據序列化協議(輕便高效) 編寫 .proto 文件是定義 gRPC 服務和消息結構等的關鍵步驟。以下是詳細指南&#xff0c;包括編寫 .proto 文件的基本語法和注意事項。 1. 基本語法 一個 .proto 文件通常包…

Docker 中的代理

docker 中的代理設置分為兩類&#xff1a;docker 使用代理訪問網絡&#xff1b;docker container 使用代理訪問網絡。因此要注意區分。 使用代理下載鏡像 第一種情況比較適合當下不能直接訪問docker官方鏡像庫的情況。 # 創建配置文件&#xff1b;設置是針對 daemon&#xf…

關于Mysql的InnoDB引擎在長期添加和刪除情況下引起的性能問題

場景一&#xff1a; 公司的大數據平臺&#xff0c;每天都會從別的節點中同步數據到某個表中&#xff0c;同時這個表要進行大量的刪除和添加 問題&#xff1a;在這個表只有2W多條數據的時候&#xff0c;使用一個count(*)語句&#xff0c;數據查詢花費了近10秒 原因&#xff1…