Linux C++ 052-設計模式之享元模式

Linux C++ 052-設計模式之享元模式

本節關鍵字:Linux、C++、設計模式、享元模式
相關庫函數:

概念

享元模式(FlyWeight),運用共享技術有效的支持大量細粒度的對象。

典型的享元模式的例子為文書處理器中以圖形結構來表示字符。一個做法是,每個字形有其字型外觀, 字模 metrics,和其它格式資訊,但這會使每個字符就耗用上千字節。取而代之的是,每個字符參照到一個共享字形物件,此物件會被其它有共同特質的字符所分享;只有每個字符(文件中或頁面中)的位置才需要另外儲存。

使用場景

兩個狀態
內蘊狀態存儲在享元內部,不會隨環境的改變而有所不同,是可以共享的。
外蘊狀態是不可以共享的,它隨環境的改變而改變的,因此外蘊狀態是由客戶端來保持(因為環境的變化是由客戶端引起的)。

如果一個應用程序使用了大量的對象,而這些對象造成了很大的存儲開銷的時候就可以考慮是否可以使用享元模式。
例如,如果發現某個對象的生成了大量細粒度的實例,并且這些實例除了幾個參數外基本是相同的,如果把那些共享參數移到類外面,在方法調用時將他們傳遞進來,就可以通過共享大幅度單個實例的數目。

角色說明

1、抽象享元角色:為具體享元角色規定了必須實現的方法,而外蘊狀態就是以參數的形式通過此方法傳入。在Java中可以由抽象類、接口來擔當。
2、具體享元角色:實現抽象角色規定的方法。如果存在內蘊狀態,就負責為內蘊狀態提供存儲空間。
3、享元工廠角色:負責創建和管理享元角色。要想達到共享的目的,這個角色的實現是關鍵!
4、客戶端角色:維護對所有享元對象的引用,而且還需要存儲對應的外蘊狀態。

代碼示例

// 運用共享技術(享)有效地支持大量細粒度(元)的對象。在有大量的對象時,把其中共有的部分抽象出來,如果有相同的業務請求時,直接返回內存中已有的對象,避免重新創建
// 享元模式的使用情況:
//        系統中有大量的對象,消耗大量的內存,且這些對象的狀態可被外部化
// 對于享元模式,對象的信息分為兩個部分:內部狀態和外部狀態
//        內部狀態:指被共享出來的信息,存儲在享元對象的內部,且不隨環境改變
//        外部狀態:不可共享,隨環境改變而改變,有客戶端來控制
//
// 享元類接口
class WebSite
{
public:virtual void use() = 0;
};
// 具體的享元類
class ConcreteWebSite : public WebSite
{
private:string name;
public:ConcreteWebSite(string name) {this->name = name;}void use() {cout << "website catagory: " << endl;}
};
// 享元工廠
class WebSiteFactory
{
private:map<string, WebSite*> wf;
public:WebSite* getWebSiteCategory(string key) {if (wf.find(key) == wf.end()) {wf[key] = new ConcreteWebSite(key);}return wf[key];}int getWebSiteCount() {return wf.size();}
};
int main_WebSite()
{WebSiteFactory* wf = new WebSiteFactory();WebSite* fx = wf->getWebSiteCategory("good");fx->use();WebSite* fy = wf->getWebSiteCategory("present");fy->use();WebSite* fz = wf->getWebSiteCategory("present");fz->use();cout << wf->getWebSiteCount() << endl;return 0;
}
/* 運行結果: 上述代碼中,我們發現相同的對象將不再創建,直接使用之前已有的
website catagory: good
website catagory: present
website catagory: present
website catagory: blog
website catagory: blog
3
*/

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

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

相關文章

探索 Prompt 的世界:讓你的 AI 更智能

探索 Prompt 的世界&#xff1a;讓你的 AI 更智能 引言什么是 Prompt&#xff1f;Prompt 的重要性如何編寫有效的 Prompt1. 清晰明確2. 包含關鍵細節3. 提供上下文 實踐中的 Prompt 技巧1. 多次迭代2. 實驗不同風格3. 結合實際應用 總結 引言 隨著人工智能&#xff08;AI&…

數據恢復篇:適用于 Android 的恢復工具

正在擺弄 Android 設備。突然&#xff0c;您意外刪除了一張或多張圖片。不用擔心&#xff0c;您總能找到一款價格實惠的照片恢復應用。這款先進的軟件可幫助 Android 用戶從硬盤、安全數字 (SD) 或存儲卡以及數碼相機中恢復已刪除的圖片。 Android 上文件被刪除的主要原因 在獲…

采用自動微分進行模型的訓練

自動微分訓練模型 簡單代碼實現&#xff1a; import torch import torch.nn as nn import torch.optim as optim# 定義一個簡單的線性回歸模型 class LinearRegression(nn.Module):def __init__(self):super(LinearRegression, self).__init__()self.linear nn.Linear(1, 1) …

【Linux】數據流重定向

數據流重定向&#xff08;redirect&#xff09;由字面上的意思來看&#xff0c;好像就是將【數據給它定向到其他地方去】的樣子&#xff1f; 沒錯&#xff0c;數據流重定向就是將某個命令執行后應該要出現在屏幕上的數據&#xff0c;給它傳輸到其他的地方&#xff0c;例如文件或…

[圖解]企業應用架構模式2024新譯本講解26-層超類型2

1 00:00:00,510 --> 00:00:03,030 這個時候&#xff0c;如果再次查找所有人員 2 00:00:03,040 --> 00:00:03,750 我們會發現 3 00:00:05,010 --> 00:00:06,370 這一次所有的對象 4 00:00:06,740 --> 00:00:08,690 都是來自標識映射的 5 00:00:10,540 --> 00…

VB 上位機開發

VB 上位機開發第一節 在 VB(Visual Basic)上位機開發的第一節課程中涵蓋以下基礎內容: 一、上位機開發簡介 解釋上位機的概念和作用,它是與硬件設備進行通信和控制的軟件應用程序。舉例說明上位機在工業自動化、智能家居、監控系統等領域的應用。二、VB 開發環境介紹 展示如…

2024遼寧省數學建模C題【改性生物碳對水中洛克沙胂和砷離子的吸附】原創論文分享

大家好呀&#xff0c;從發布賽題一直到現在&#xff0c;總算完成了2024 年遼寧省大學數學建模競賽C題改性生物碳對水中洛克沙胂和砷離子的吸附完整的成品論文。 本論文可以保證原創&#xff0c;保證高質量。絕不是隨便引用一大堆模型和代碼復制粘貼進來完全沒有應用糊弄人的垃…

Rubber Duck Debugging: History and Benefits 橡皮鴨調試:歷史和優勢

注&#xff1a;機翻&#xff0c;未校對。 Discover the origins of rubber duck debugging, why it works, and why it has become so popular among programmers. 了解橡皮鴨調試的起源&#xff0c;它為什么有效&#xff0c;以及為什么它在程序員中如此受歡迎。 Debugging co…

AMD CPU加 vega 顯卡運行ollama本地大模型

顯卡是VEGA56&#xff0c;這個卡代號是gfx900 雖然ollama頁面上寫著這個卡可以&#xff0c;但是實際是不可以的 報錯如下&#xff1a; levelWARN sourceamd_windows.go:97 msg"amdgpu is not supported" gpu0 gpu_typegfx900:xnack 它認為的GPU型號是 gfx900:xna…

【JavaScript】解決 JavaScript 語言報錯:Uncaught SyntaxError: Unexpected identifier

文章目錄 一、背景介紹常見場景 二、報錯信息解析三、常見原因分析1. 缺少必要的標點符號2. 使用了不正確的標識符3. 關鍵詞拼寫錯誤4. 變量名與保留字沖突 四、解決方案與預防措施1. 檢查和添加必要的標點符號2. 使用正確的標識符3. 檢查關鍵詞拼寫4. 避免使用保留字作為變量名…

全棧 Discord 克隆:Next.js 13、React、Socket.io、Prisma、Tailwind、MySQL筆記(一)

前言 閱讀本文你需要有 Next.js 基礎 React 基礎 Prisma 基礎 tailwind 基礎 MySql基礎 準備工作 打開網站 https://ui.shadcn.com/docs 這不是一個組件庫。它是可重用組件的集合&#xff0c;您可以將其復制并粘貼到應用中。 打開installation 選擇Next.js 也就是此頁面…

Python3 第十七課 -- 編程第一步

目錄 一. 前言 二. end 關鍵字 一. 前言 在前面的教程中我們已經學習了一些 Python3 的基本語法知識&#xff0c;接下來我們來嘗試一些實例。 打印字符串: print("Hello, world!") 輸出結果為&#xff1a; Hello, world! 輸出變量值&#xff1a; i 256*256…

智慧校園服務監控功能

智慧校園系統中的服務監控功能&#xff0c;扮演著維護整個校園數字化生態系統穩定與高效運作的重要角色。它如同一位全天候的守護者&#xff0c;通過實時跟蹤、分析并響應系統各層面的運行狀況&#xff0c;確保教學、管理等核心業務流程的順暢進行。 服務監控功能覆蓋了智慧校園…

開發個人Ollama-Chat--6 OpenUI

開發個人Ollama-Chat–6 OpenUI Open-webui Open WebUI 是一種可擴展、功能豐富且用戶友好的自托管 WebUI&#xff0c;旨在完全離線運行。它支持各種 LLM 運行器&#xff0c;包括 Ollama 和 OpenAI 兼容的 API。 功能 由于總所周知的原由&#xff0c;OpenAI 的接口需要密鑰才…

知識圖譜與 LLM:微調與檢索增強生成

Midjourney 的知識圖譜聊天機器人的想法。 大型語言模型 (LLM) 的第一波炒作來自 ChatGPT 和類似的基于網絡的聊天機器人&#xff0c;這些模型在理解和生成文本方面非常出色&#xff0c;這讓人們&#xff08;包括我自己&#xff09;感到震驚。 我們中的許多人登錄并測試了它寫…

微信視頻號的視頻怎么下載到本地?快速教你下載視頻號視頻

天來說說市面上常見的微信視頻號視頻下載工具&#xff0c;教大家快速下載視頻號視頻&#xff01; 方法一&#xff1a;緩存方法 該方法來源早期視頻技術&#xff0c;因早期無法將大量視頻通過網絡存儲&#xff0c;故而會有緩存視頻文件到手機&#xff0c;其目的為了提高用戶體驗…

尚硅谷Vue3入門到實戰,最新版vue3+TypeScript前端開發教程

Vue3 編碼規范 創建vue3工程 基于vite創建 快速上手 | Vue.js (vuejs.org) npm create vuelatest 在nodejs環境下運行進行創建 按提示進行創建 用vscode打開項目 安裝依賴 源文件有src 內有main.ts App.vue 簡單分析 編寫src vue2語法在三中適用 vue2中的date metho…

UnityECS學習中問題及總結entityQuery.ToComponentDataArray和entityQuery.ToEntityArray區別

在Unity的ECS&#xff08;Entity Component System&#xff09;開發中&#xff0c;entityQuery.ToComponentDataArray<T>(Allocator.Temp) 和 entityQuery.ToEntityArray(Allocator.Temp) 是兩種不同的方法&#xff0c;用于從實體查詢中獲取數據。除了泛型參數之外&#…

【深度學習入門篇 ⑤ 】PyTorch網絡模型創建

【&#x1f34a;易編橙&#xff1a;一個幫助編程小伙伴少走彎路的終身成長社群&#x1f34a;】 大家好&#xff0c;我是小森( &#xfe61;?o?&#xfe61; ) &#xff01; 易編橙終身成長社群創始團隊嘉賓&#xff0c;橙似錦計劃領銜成員、阿里云專家博主、騰訊云內容共創官…

git、huggingface 學術加速

1、git 有時候服務器不能直接訪問 github&#xff0c;下載代碼會很麻煩&#xff1b;安裝庫的時候&#xff0c;pip xx git 就更難了 比如&#xff0c;這次我需要安裝 unsloth&#xff0c;官方給出的腳本是&#xff1a; pip install “unsloth[cu121-torch220] githttps://git…