Flyweight(享元)設計模式 軟考 享元 和 代理屬于結構型設計模式

1.目的:運用共享技術有效地支持大量細粒度的對象

Flyweight(享元)設計模式 是一種結構型設計模式,它的核心目的是通過共享對象來減少內存消耗,特別是在需要大量相似對象的場景中。Flyweight 模式通過將對象的共享細節與不變的部分分離,盡量減少系統中對象的數量,進而提高系統的性能。

主要問題:

如果一個系統中有大量相似的對象,它們的狀態可能大部分是相同的。每個對象都會占用內存,并且在程序中創建大量相似對象會導致內存浪費和性能下降。Flyweight 模式的解決方案是將這些相似對象中共享的部分提取出來,集中存儲共享,而把變動的部分存儲在客戶端。

主要組成部分:

  1. Flyweight(享元)接口:定義享元對象的行為。享元對象通常是不可變的(immutable),因此它們可以安全地在多個客戶端之間共享。

  2. ConcreteFlyweight(具體享元):實現了 Flyweight 接口,存儲共享的狀態。

  3. FlyweightFactory(享元工廠):負責管理享元對象的創建和共享,確保每個享元對象都被重復使用。

  4. UnsharedConcreteFlyweight(非共享的具體享元):不共享的享元對象,通常用于保存可變狀態(例如,特定于客戶端的狀態)。

示例:

假設我們有一個系統,需要表示大量的 棋盤。棋盤上每個格子都有顏色、位置等屬性,但在同一個棋盤上,很多格子可能具有相同的顏色或樣式。我們可以使用 Flyweight 模式來優化內存消耗,減少重復的對象實例。

代碼示例:

// 享元接口
interface ChessPiece {void draw();
}// 具體享元類
class ConcreteChessPiece implements ChessPiece {private String color; // 享元的共享部分public ConcreteChessPiece(String color) {this.color = color;}@Overridepublic void draw() {System.out.println("Drawing " + color + " chess piece.");}
}// 享元工廠
class ChessPieceFactory {private Map<String, ChessPiece> chessPieces = new HashMap<>();public ChessPiece getChessPiece(String color) {ChessPiece piece = chessPieces.get(color);if (piece == null) {piece = new ConcreteChessPiece(color);
// 給向享元工廠, put對象,下一次就不用判斷為空了, 直接從工程里取出來就值chessPieces.put(color, piece);System.out.println("Creating new " + color + " chess piece.");}return piece;}
}// 客戶端代碼
public class FlyweightPatternDemo {public static void main(String[] args) {ChessPieceFactory factory = new ChessPieceFactory();ChessPiece whitePiece1 = factory.getChessPiece("White");whitePiece1.draw();ChessPiece blackPiece1 = factory.getChessPiece("Black");blackPiece1.draw();ChessPiece whitePiece2 = factory.getChessPiece("White");whitePiece2.draw();ChessPiece blackPiece2 = factory.getChessPiece("Black");blackPiece2.draw();ChessPiece whitePiece3 = factory.getChessPiece("White");whitePiece3.draw();}
}運行結果
Creating new White chess piece.
Drawing White chess piece.
Creating new Black chess piece.
Drawing Black chess piece.
Drawing White chess piece.
Drawing Black chess piece.
Drawing White chess piece.

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

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

相關文章

002大模型-提示詞工程,少樣本提示,角色扮演,思維鏈

一、提示詞工程 二、少樣本提示 三、角色扮演 四、思維鏈

華為OD機試真題——傳遞悄悄話(二叉樹最長路徑問題)(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳實現

2025 A卷 200分 題型 本專欄內全部題目均提供Java、python、JavaScript、C、C++、GO六種語言的最佳實現方式; 并且每種語言均涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、3個測試用例以及綜合分析; 本文收錄于專欄:《2025華為OD真題目錄+全流程解析+備考攻略+經驗分…

「讀書報告」Spark實時大數據分析

這本書是清華大學出版社2018年出版的&#xff0c;我是2020年讀的&#xff0c;說真的的&#xff0c;不怎么喜歡這本書&#xff0c;所以作者我都不想提。有的人可能會奇怪&#xff0c;ailx10&#xff0c;你一個搞網絡安全的&#xff0c;怎么會去讀大數據相關的書&#xff0c;哎&a…

2025 河北ICPC( D. 金泰園(二分)-- C.年少的誓約(公式轉化))

文章目錄 2025 河北ICPCD. 金泰園&#xff08;二分&#xff09;C.年少的誓約(公式轉化)總結 2025 河北ICPC 題目鏈接&#xff1a; Attachments - The 9th Hebei Collegiate Programming Contest - Codeforces sdccpc20250522 - Virtual Judge 賽時&#xff1a;5道 D. 金泰…

QT學習一

對于選擇qmake還是cmake&#xff0c;現在寫的暫時先用qmake 1.命名規范和快捷鍵 2.按鈕控件常用API //創建第一個按鈕QPushButton * btn new QPushButton;//讓btn對象 依賴在mywidget窗口中btn->setParent(this);//顯示文本btn->setText("第一個按鈕");//創建…

【Elasticsearch】給所索引創建多個別名

Elasticsearch 是可以給索引創建多個別名的。 為什么可以創建多個別名 1. 靈活性 - 別名可以為索引提供一個更易于理解的名稱&#xff0c;方便用戶根據不同的業務場景或用途來引用同一個索引。例如&#xff0c;一個索引可能同時服務于多個不同的應用程序或服務&#xff0c;通…

使用 OpenCV 實現哈哈鏡效果

在計算機視覺和圖像處理領域&#xff0c;OpenCV 提供了非常強大的圖像幾何變換能力&#xff0c;不僅可以用于糾正圖像&#xff0c;還能制造各種“有趣”的視覺效果。今天&#xff0c;我們就來實現一個經典的“哈哈鏡”效果&#xff0c;讓圖像像在游樂園里一樣被拉伸、壓縮、扭曲…

AI|Java開發 IntelliJ IDEA中接入本地部署的deepseek方法

目錄 連接本地部署的deepseek&#xff1a; IntelliJ IDEA中使用deepseek等AI&#xff1a; 用法一&#xff1a;讓AI寫代碼 用法二&#xff1a;選中這段代碼&#xff0c;右鍵&#xff0c;可以讓其解釋這段代碼的含義。這時顯示的解釋是英文的。 連接本地部署的deepseek&#…

如何使用兩塊硬盤作為 Ubuntu24 的系統盤,實現壞掉一塊不影響系統運行。

最近我想使用Ubuntu組一個NAS系統&#xff0c;想實現系統盤冗余&#xff0c;各位大佬可以給點建議嗎。 Deep Seek 為了實現兩塊硬盤作為 Ubuntu 24 系統盤的冗余配置&#xff08;RAID 1&#xff09;&#xff0c;確保一塊硬盤損壞時系統仍可運行&#xff0c;以下是詳細步驟&am…

【2025最新】虛擬機安裝macos,VMware在Windows11上安裝macOS 15完整圖文教程 - 新手也能輕松上手

引言 想體驗蘋果系統但不想買Mac電腦&#xff1f;別擔心&#xff01;本教程將手把手教你如何在Windows11環境下&#xff0c;通過VMware虛擬機安裝macOS Sequoia15系統。即使你是零基礎小白&#xff0c;按照這個步驟操作&#xff0c;也能輕松搞定&#xff01; 準備工作 在開始…

論文閱讀筆記——Emerging Properties in Unified Multimodal Pretraining

BAGEL 論文 商業閉源系統與學術/開源模型的差距很大&#xff0c;BAGEL 旨在通過開源統一架構大規模交錯數據主要解決&#xff1a; 架構割裂&#xff1a;理解/生成分屬兩條網絡&#xff0c;信息被壓縮在少量條件 token 中&#xff0c;長上下文推理受限。數據貧乏&#xff1a;主…

Go 語言基礎1 Slice,map,string

更多個人筆記見&#xff1a; github個人筆記倉庫 gitee 個人筆記倉庫 個人學習&#xff0c;學習過程中還會不斷補充&#xff5e; &#xff08;后續會更新在github上&#xff09; 文章目錄 stirng 字符串區分 rune&#xff0c;byte&#xff0c;string字符串操作strings 庫相關 f…

C# AI(Trae工具+claude3.5-sonnet) 寫前后端

這是一個AI 寫的前后端分離項目,通過AI編程&#xff0c;開發電商管理系統&#xff08;登陸、注冊&#xff09; 使用的AI工具為 Trae工具(字節國際版)claude3.5-sonnet(目前代碼最強模型) 前端為 vue3Bootstrap 后端為 C# net5.0(因為我電腦里面已經安裝了這個新版更好) do…

10G/25G PCS only mode for CoaXPress Over Fiber

背景 在CoaXPress Over Fiber的需求中, 需要利用XGMII的PCS 實現25G 數據速率的穩定傳輸&#xff0c;也就是不需要其MAC層&#xff0c;只保留PMA PCS層&#xff0c;借用其物理端口 線纜&#xff0c;實現其它協議的數據傳輸。 25G PCS 25GMII 的 TX/RX 時鐘頻率在 DDR&#xff…

掌握聚合函數:COUNT,MAX,MIN,SUM,AVG,GROUP BY和HAVING子句的用法,Where和HAVING的區別

對于Java后端開發來說&#xff0c;必須要掌握常用的聚合函數&#xff1a;COUNT&#xff0c;MAX&#xff0c;MIN&#xff0c;SUM&#xff0c;AVG&#xff0c;掌握GROUP BY和HAVING子句的用法&#xff0c;掌握Where和HAVING的區別&#xff1a; ? 一、常用聚合函數&#xff08;聚…

無人機飛行間隔安全智能評估、安全風險評估

無人機空中安全飛行評估需結合改進碰撞模型、蒙特卡洛仿真、安全間隔反推及動態避障策略&#xff0c;通過多機型分類與實時數據融合&#xff0c;實現從理論建模到實際部署的全流程管控&#xff0c;為城市低空密集飛行提供安全保障。 需求 無人機飛行間隔安全智能評估 無人機…

pdf圖片導出(Visio和Origin)

一、Visio 導入pdf格式圖片 1. 設計->大小&#xff0c;適應繪圖。 2. 文件->導出&#xff0c;導出為pdf格式。 上面兩部即可得到只包含圖的部分的pdf格式。 如果出現的有默認白邊&#xff0c;可以通過以下方式設置&#xff1a; 1. 文件->選項->自定義功能區->…

實現一個帶有授權碼和使用時間限制的Spring Boot項目

生成和驗證授權碼記錄授權時間和過期時間實現授權邏輯 以下是具體的實現方法&#xff1a; 1. 生成和驗證授權碼 可以使用加密技術生成和驗證授權碼。授權碼中可以包含有效期等信息&#xff0c;并使用密鑰進行簽名。 示例代碼&#xff1a; java復制代碼 import javax.crypt…

官方SDK停更后的選擇:開源維護的Bugly Unity SDK

騰訊Bugly&#xff0c;為移動開發者提供專業的異常上報和運營統計&#xff0c;幫助開發者快速發現并解決異常&#xff0c;同時掌握產品運營動態&#xff0c;及時跟進用戶反饋。 但是&#xff0c;免費版的Unity SDK已經很久不更新了&#xff0c;會有一些問題和特性缺失&#xff…

Spring Boot分頁查詢進階:整合Spring Data REST實現高效數據導航

目錄&#xff1a; 引言分頁查詢基礎回顧 2.1 Spring Data JPA分頁接口 2.2 Pageable與Page的使用 2.3 常見分頁參數設計Spring Data REST簡介 3.1 HATEOAS與超媒體驅動API 3.2 Spring Data REST核心功能 3.3 自動暴露Repository接口整合Spring Boot與Spring Data REST 4.1 項目…