23種設計模式-結構型模式之享元模式(Java版本)

Java 享元模式(Flyweight Pattern)詳解

🦋 什么是享元模式?

享元模式是一種結構型模式,它通過共享相同的對象來減少內存消耗,適用于大量細粒度對象的場景。關鍵思想是緩存重復出現的對象,避免重復創建。


🧠 使用場景

  • 系統中存在大量相似對象
  • 對象的狀態可分為內部狀態(可共享)外部狀態(不可共享)
  • 對象創建代價高,影響性能

🏗? 模式結構

  • Flyweight(享元抽象類):定義共享接口
  • ConcreteFlyweight(具體享元類):實現共享邏輯,存儲內部狀態
  • FlyweightFactory(享元工廠):管理享元對象池,復用已有對象

? 示例:圍棋棋子池

享元接口(Flyweight)

public interface ChessPiece {void display(String position);
}

具體享元(ConcreteFlyweight)

public class BlackChess implements ChessPiece {@Overridepublic void display(String position) {System.out.println("? 黑棋,位置:" + position);}
}public class WhiteChess implements ChessPiece {@Overridepublic void display(String position) {System.out.println("? 白棋,位置:" + position);}
}

享元工廠(FlyweightFactory)

import java.util.HashMap;
import java.util.Map;public class ChessFactory {private static final Map<String, ChessPiece> cache = new HashMap<>();public static ChessPiece getChess(String color) {ChessPiece piece = cache.get(color);if (piece == null) {if (color.equalsIgnoreCase("black")) {piece = new BlackChess();} else if (color.equalsIgnoreCase("white")) {piece = new WhiteChess();}cache.put(color, piece);}return piece;}
}

客戶端調用

public class Client {public static void main(String[] args) {ChessPiece black1 = ChessFactory.getChess("black");ChessPiece black2 = ChessFactory.getChess("black");ChessPiece white1 = ChessFactory.getChess("white");black1.display("A1");black2.display("B2");white1.display("C3");System.out.println("black1 與 black2 是否為同一對象?" + (black1 == black2)); // true}
}

🧩 優點

  • 大量相似對象可以復用,節省內存,提升性能

  • 將共享與非共享狀態區分清晰,結構更清晰

?? 缺點

  • 系統邏輯變復雜,需要區分內部與外部狀態

  • 不適合對象差異性大的情況

? 使用建議

  • 適用于如下情況:

  • 游戲對象池(如子彈、精靈)

  • 數據庫連接池、線程池

  • 文本編輯器中的字體對象共享

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

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

相關文章

瀏覽器訪問背后的秘密:從加載到關閉,數據是否會丟失?

? 一次瀏覽器訪問 www.xxx.com 背后發生了什么&#xff1f; —— 以及“我點了 &#xff0c;數據會不會丟&#xff1f;”的深度剖析 適讀人群&#xff1a;Web 開發者、運維工程師、性能調優/安全從業者 1?? 打開瀏覽器敲下網址&#xff1a;鏈路是如何啟動的&#xff1f; 階…

【HDFS入門】深入解析DistCp:Hadoop分布式拷貝工具的原理與實踐

目錄 1 DistCp概述與應用場景 2 DistCp架構設計解析 2.1 系統架構圖 2.2 執行流程圖 3 DistCp核心技術原理 3.1 并行拷貝機制 3.2 斷點續傳實現原理 4 DistCp實戰指南 4.1 常用命令示例 4.2 性能優化策略 5 異常處理與監控 5.1 常見錯誤處理流程 5.2 監控指標建議…

hbuilderx云打包生成的ipa文件如何上架

使用hbuilderx打包&#xff0c;會遇到一個問題。開發的ios應用&#xff0c;需要上架到app store&#xff0c;因此&#xff0c;就需要APP store的簽名證書&#xff0c;并且還需要一個像xcode那樣的工具來上架app store。 我們這篇文章說明下&#xff0c;如何在windows電腦&…

第十五屆藍橋杯 2024 C/C++組 拼正方形

目錄 題目&#xff1a; 題目描述&#xff1a; 題目鏈接&#xff1a; 思路&#xff1a; 思路詳解&#xff1a; 易錯點&#xff1a; 代碼&#xff1a; 代碼詳解&#xff1a; 題目&#xff1a; 題目描述&#xff1a; 題目鏈接&#xff1a; P10898 [藍橋杯 2024 省 C] 拼正…

華為云獲取IAM用戶Token的方式及適用分析

&#x1f9e0; 一、為什么要獲取 IAM 用戶 Token&#xff1f; 我們用一個生活中的比喻來解釋&#x1f447;&#xff1a; &#x1f3e2; 比喻場景&#xff1a; 你要去一個 高級寫字樓&#xff08;華為云物聯網平臺&#xff09; 辦事&#xff08;調用接口管理設備&#xff09;&…

樂聚機器人與地瓜機器人達成戰略合作,聯合發布Aelos Embodied具身智能

要聞 4月19日&#xff0c;在CCF人形機器人與人工智能技術巡回研討會&#xff08;武漢站&#xff09;上&#xff0c;樂聚機器人與地瓜機器人達成戰略合作&#xff0c;雙方將基于RDK X5、RDK S100以及更高性能的國產大算力平臺&#xff0c;就夸父&#xff08;KUAVO&#xff09;、…

Web3架構下的數據隱私與保護

在這個信息爆炸的時代&#xff0c;Web3的概念如同一股清流&#xff0c;以其去中心化的特性&#xff0c;為數據隱私與保護帶來了新的希望。Web3&#xff0c;也被稱作下一代互聯網&#xff0c;它通過區塊鏈技術實現數據的去中心化存儲和處理&#xff0c;旨在提高數據的安全性和隱…

【OceanBase相關】02-OceanBase數據庫NFS備份實踐

文章目錄 一、前言1、概述2、備份方式3、備份流程4、恢復流程二、NFS備份1、注意事項2、服務端配置3、客戶端配置4、備份策略配置三、常用操作四、Q&A1、數據備份任務執行失敗,提示`start log archive backup when not STOP is not supported`1.1、問題說明1.2、解決措施2…

一行命令打開iOS模擬器

要在 Mac 命令行打開 iPhone 15 Pro 模擬器&#xff0c;需滿足已安裝 Xcode 這一前提條件&#xff0c;以下是具體操作步驟&#xff1a; 步驟一&#xff1a;列出所有可用模擬器設備 打開終端&#xff08;Terminal&#xff09;&#xff0c;輸入并執行以下命令&#xff0c;用于列…

Java虛擬機(JVM)家族發展史及版本對比

Java虛擬機&#xff08;JVM&#xff09;家族發展史及版本對比 一、JVM家族發展史 1. 早期階段&#xff08;1996-2000&#xff09; Classic VM&#xff08;Java 1.0-1.1&#xff09;&#xff1a; 廠商&#xff1a;Sun Microsystems&#xff08;Oracle前身&#xff09;。特點&…

嘻游電玩三端客戶端部署實戰:PC + Android + iOS 環境全覆蓋教程

本篇文章將針對“網狐系列嘻游電玩組件”的三端客戶端&#xff08;PC端、安卓端、iOS端&#xff09;進行詳細部署實操講解。文章將以實測部署為核心&#xff0c;提供資源結構說明、平臺適配調整、打包配置、常見問題修復&#xff0c;并輔以必要的關鍵配置代碼。 一、客戶端資源…

LabVIEW實現Voronoi圖繪制功能

該 LabVIEW 虛擬儀器&#xff08;VI&#xff09;借助 MathScript 節點&#xff0c;實現基于手機信號塔位置計算 Voronoi 圖的功能。通過操作演示&#xff0c;能直觀展示 Voronoi 圖在空間劃分上的應用。 各部分功能詳細說明 隨機地形創建部分 功能&#xff1a;根據 “Maximum a…

web刷題筆記

2024isctf ezrce 禁用了一些關鍵字符&#xff0c;查詢函數&#xff0c;系統執行函數&#xff0c;執行函數都有&#xff0c;空格也和斜桿也禁用了&#xff0c;但是其他一些很大一部分字符都沒有禁用&#xff0c;屬于關鍵詞禁用的類型&#xff0c;正常的步驟是去查一下列表&#…

集結號海螺捕魚游戲源碼解析(第二篇):水滸傳捕魚模塊邏輯與服務器幀同步詳解

本篇將全面解構“水滸傳”子游戲的服務端核心邏輯、幀同步機制、魚群刷新規則、客戶端命中表現與服務器計算之間的協同方式&#xff0c;聚焦于 C 與 Unity3D 跨端同步的真實實現過程。 一、水滸傳捕魚模塊資源結構 該模塊包含三部分核心目錄&#xff1a; 子游戲/game_shuihuz…

【產品經理從0到1】原型及Axure介紹

原型分類 原型的三種分類&#xff1a; 草圖原型&#xff1a;?繪稿&#xff0c;制作?便&#xff0c;修改不?便&#xff1b;低保真原型&#xff1a;簡單交互&#xff0c;?設計圖&#xff1b; 最好的原型是??灰的&#xff1b;?保真原型&#xff1a;復雜交互&#xff0c;有…

CVE-2024-23897-Jenkins 2.441之前版本存在任意文件讀取漏洞

1.漏洞介紹 Jenkins 2.441及更早版本&#xff0c;以及LTS 2.426.2及更早版本沒有禁用其CLI命令解析器的一個功能&#xff0c;該功能會將參數中字符后跟的文件路徑替換為該文件的內容&#xff0c;允許未經身份驗證的攻擊者讀取Jenkins控制器文件系統上的任意文件。 2.poc利用 下…

PostgreSQL性能調優與內核優化怎么做?

PostgreSQL 的高級性能調優和內核優化是PGCM認證的核心能力之一&#xff0c;也是企業級數據庫場景中解決性能瓶頸的關鍵手段。以下是直白易懂的實戰解析&#xff1a; 一、性能調優&#xff1a;讓數據庫“跑得更快” 1. 執行計劃優化 問題場景&#xff1a;一個復雜查詢耗時10秒…

DeepSeek是否采用了混合專家(MoE)架構?它如何提升模型效率?

引言 最近&#xff0c;關于DeepSeek是否采用混合專家&#xff08;Mixture of Experts&#xff0c;MoE&#xff09;架構的討論越來越多。MoE技術因其高效的計算特性&#xff0c;已經成為大模型訓練的熱門選擇。那么&#xff0c;DeepSeek到底有沒有用MoE&#xff1f;如果用了&am…

HTTP 請求頭與請求體:數據存儲的底層邏輯與實踐指南

文章目錄 一、數據承載的本質差異1.1、請求頭:元數據的 "集裝箱"1.2、請求體:業務數據的 "運輸艙"二、請求方式的選擇邏輯2.1、GET 請求:無體的輕量級交互2.2、POST 請求:體數據的主力軍2.3、PUT/PATCH 請求:體數據的更新場景三、參數屬性的深度解析3…

【網工第6版】第5章 網絡互聯②

目錄 ■ IPV6 ▲ IPV6報文格式 ◎ IPV6擴展報頭&#xff08;RFC2460&#xff09; ◎ IPv6相關協議 ▲ IPV6地址分類 ◎ IPv6地址基礎 ◎ IPv6地址舉例 ◎ IPv6地址分類 ◎ 特殊地址對比IPv4 vs IPv6 ▲ 過渡技術 本章重要程度&#xff1a;☆☆☆☆☆ ■ IPV6 與IPv4…