設計模式(十二)享元模式

請直接看原文:
原文鏈接:設計模式(十二)享元模式-CSDN博客

--------------------------------------------------------------------------------------------------------------------------------?

享元模式定義

享元模式是結構型設計模式的一種,是池技術的重要實現方式,它可以減少應用程序創建的對象,降低程序內存的占用,提高程序的性能。

定義:使用共享對象有效的支持大量細粒度的對象

要求細粒度對象,那么不可避免地使得對象數量多且性質相近,這些對象分為兩個部分:內部狀態和外部狀態。內部狀態是對象可共享出來的信息,存儲在享元對象內部并且不會隨環境的改變而改變。而外部狀態是對象依賴的一個標記是隨環境改變而改變的并且不可共享的狀態。
享元模式結構圖如下圖所示。
享元模式結構圖

在享元模式中有如下角色:
- Flyweight:抽象享元角色,同時定義出對象的外部狀態和內部狀態的接口或者實現。
- ConcreteFlyweight:具體享元角色,實現抽象享元角色定義的業務。
- FlyweightFactory:享元工廠,負責管理對象池和創建享元對象。

享元模式簡單實現

某寶商城賣商品,如果每個用戶下單都生成商品對象顯然會耗費很多資源,如果趕上雙11,那恐怖的訂單量會生成很多商品對象,更何況商城賣的商品種類繁多,這樣就極易會產生OOM。因此我們采用享元模式來對商品的創建進行優化。

抽象享元角色

抽象享元角色是一個商品接口,它定義了showGoodsPrice方法用來展示商品的價格:

public interface IGoods {public void showGoodsPrice(String name);
}
具體享元角色

定義類Goods,它實現IGoods 接口,并實現了showGoodsPrice方法,如下所示。

public class Goods implements IGoods{private String name;//名稱private String version;//版本Goods(String name){this.name=name;}@Overridepublic void showGoodsPrice(String version) {if(version.equals("32G")){System.out.println("價格為5199元");}else if(version.equals("128G")){System.out.println("價格為5999元");}}
}
其中name為內部狀態,version為外部狀態。showGoodsPrice方法根據version的不同會打印出不同的價格。
享元工廠
public class GoodsFactory {private static Map<String,Goods> pool=new HashMap<String, Goods>();public static Goods getGoods(String name){if(pool.containsKey(name)){System.out.println("使用緩存,key為:"+name);return pool.get(name);}else{Goods goods=new Goods(name);pool.put(name,goods);System.out.println("創建商品,key為:"+name);return goods;}}
}

享元工廠GoodsFactory 用來創建Goods對象。通過Map容器來存儲Goods對象,將內部狀態name作為Map的key,以便標識Goods對象。如果Map容器中包含此key,則使用Map容器中存儲的Goods對象,否則就新創建Goods對象,并放入Map容器中。

客戶端調用

客戶端中調用GoodsFactory的getGoods方法來創建Goods對象,并調用Goods 的showGoodsPrice方法來顯示產品的價格,如下所示。


public class Client {public static void main(String[]args) {Goods goods1=GoodsFactory.getGoods("iphone7");goods1.showGoodsPrice("32G");Goods goods2=GoodsFactory.getGoods("iphone7");goods2.showGoodsPrice("32G");Goods goods3=GoodsFactory.getGoods("iphone7");goods3.showGoodsPrice("128G");}
}

運行結果為:
創建商品,key為:iphone7
價格為5199元
使用緩存,key為:iphone7
價格為5199元
使用緩存,key為:iphone7
價格為5999元

從輸出看出,只有第一次是創建Goods對象,后面因為key值相同,所以都是使用了對象池中的Goods對象。在這個例子中,name作為內部狀態是不變的,并且作為Map的key值是可以共享的。而showGoodsPrice方法中需要傳入的version值則是外部狀態,他的值是變化的。

享元模式的使用場景
  • 系統中存在大量的相似對象。
  • 需要緩沖池的場景。
  • 細粒度的對象都具備較接近的外部狀態,而且內部狀態與環境無關,也就是說對象沒有特定身份。

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

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

相關文章

Kubernetes-1

學習Kubernetes第一天 k8s-11、什么是Kubernetes2、配置Kubernetes2.1、準備三臺全新的虛擬機2.2、關閉防火墻和SElinux2.3、修改主機名2.4、升級操作系統(三臺一起操作)2.5、配置主機hosts文件&#xff0c;相互之間通過主機名互相訪問2.6、配置master和node之間的免密通道2.7、…

KMP算法和Manacher算法

KMP算法 KMP算法解決的問題 KMP算法用來解決字符串匹配問題: 找到長串中短串出現的位置. KMP算法思路 暴力比較與KMP的區別 暴力匹配: 對長串的每個位,都從頭開始匹配短串的所有位. KMP算法: 將短字符串前后相同的部分存儲在 n e x t next next數組里,讓之前匹配過的信息指…

我的單片機入門之旅

我的單片機入門之旅 前言 單片機作為現代電子技術的重要組成部分&#xff0c;廣泛應用于各個領域。而作為一個初學者&#xff0c;我對單片機一無所知。但是&#xff0c;通過不斷的學習和實踐&#xff0c;我逐漸掌握了單片機的基本概念和使用方法。在我的單片機入門之旅中&…

【每日前端面經】2024-03-03

題目來源: 牛客 說說你對Vue3的理解&#xff1f; Vue2面對對象編程&#xff0c;Vue3函數時編程對TS支持的更好選項式API替代組合式API響應式原理由Object.defineProperty變為Proxy支持template中存在多個根節點重寫虛擬DOM增加setup修飾符支持tree-shaking&#xff0c;減小體…

代碼隨想錄算法訓練營(動態規劃10,11 股票問題)| 121. 買賣股票的最佳時機 122.買賣股票的最佳時機II

動態規劃10 動態規劃5步曲&#xff0c;個人感覺應該加一步狀態分析 狀態分析&#xff1a; 列出所有的狀態&#xff0c;將狀態歸納后定義dp數組狀態轉移&#xff0c;狀態怎么轉移也就是遞推公式是什么 買賣股票的動規五部曲分析如下&#xff1a; 1 確定dp數組&#xff08;d…

pytorch中的可學習查找表實現之nn.Embedding

假設我們需要一個查找表&#xff08;Lookup Table&#xff09;&#xff0c;我們可以根據索引數字快速定位查找表中某個具體位置并讀取出來。最簡單的方法&#xff0c;可以通過一個二維數組或者二維list來實現。但如果我希望查找表的值可以通過梯度反向傳播來修改&#xff0c;那…

上傳項目的全部依賴到maven私有倉庫-nexus

背景 項目之前的私有倉庫不能使用了&#xff0c;本地倉庫可以&#xff0c;但是一旦clean就沒了&#xff0c;所以在本地有依賴的時候可以自己搭建一個maven私有倉庫然后將依賴全部上傳上去 搭建&#xff1a;使用docker-compose方式搭建 docker-compose文件 version: "3…

C語言入門到精通之練習47:一個偶數總能表示為兩個素數之和。

題目&#xff1a;一個偶數總能表示為兩個素數之和。 程序分析&#xff1a;我去&#xff0c;這是什么題目&#xff0c;要我證明這個問題嗎&#xff1f;真不知道怎么證明。那就把一個偶數串聯成兩個素數吧。 實例 #include<stdio.h> #include<stdlib.h> int Isprime…

Python算法100例-3.1 回文數

完整源代碼項目地址&#xff0c;關注博主私信源代碼后可獲取 1.問題描述2.問題分析3.算法設計4.確定程序框架5.完整的程序6.問題拓展7.巧用字符串技巧 1&#xff0e;問題描述 打印所有不超過n&#xff08;取n<256&#xff09;的其平方具有對稱性質的數&#xff08;也稱回…

在國內如何申請US,visa卡?

隨著跨境與AI的發展大家對美國虛擬卡的需求也越來越多&#xff0c;比如說亞馬遜、ebay、Etsy、ChatGPTPLUS、midjourney、POE等等軟件以及海淘的需要&#xff0c;所以我們需要用到美國虛擬卡的場景就越來越多 如何獲得一張US 虛擬信用卡&#xff1f; 方法很簡單&#xff0c;點…

一線大廠軟件測試面試題及答案解析,2024最強版...

【軟件測試面試突擊班】2024吃透軟件測試面試最全八股文攻略教程&#xff0c;一周學完讓你面試通過率提高90%&#xff01;&#xff08;自動化測試&#xff09; 1、什么是兼容性測試?兼容性測試側重哪些方面? 參考答案: 兼容測試主要是檢查軟件在不同的硬件平臺、軟件平臺上…

CNAN知識圖譜輔助推薦系統

CNAN知識圖譜輔助推薦系統 文章介紹了一個基于KG的推薦系統模型&#xff0c;代碼也已開源&#xff0c;可以看出主要follow了KGNN-LS 。算法流程大致如下&#xff1a; 1. 算法介紹 算法除去attention機制外&#xff0c;主要的思想在于&#xff1a;user由交互過的item來表示、i…

OpenShift AI - 部署并使用 LLM 模型

《OpenShift / RHEL / DevSecOps 匯總目錄》 說明&#xff1a;本文已經在 OpenShift 4.15 RHODS 2.7.0 的環境中驗證 文章目錄 安裝 OpenShift AI 環境安裝 Minio 對象存儲軟件配置 Single Model Serving 運行環境創建項目和 Workbench準備模型和配置 Model Server訪問 LLM 模…

arm-linux-gnueabi、arm-linux-gnueabihf 交叉編譯器區別

1、arm-linux-gnueabi&#xff1a; 使用軟件浮點&#xff08;軟浮點&#xff09;。這意味著所有的浮點運算都將由軟件庫來處理&#xff0c;而不會利用硬件中的浮點運算單元。因此&#xff0c;生成的目標代碼包含了對軟件浮點庫的調用。 2、arm-linux-gnueabihf&#xff1a; 使…

c++八股文:c++新特性

文章目錄 [toc] 1.C11的新特性有哪些2.智能指針3.類型推導4.左值和右值5.nullptr6.范圍for循環7.lambda表達式參考 1.C11的新特性有哪些 語法的改進 &#xff08;1&#xff09;統?的初始化?法 &#xff08;2&#xff09;成員變量默認初始化 &#xff08;3&#xff09;auto關…

mybatis中#{}和${}的區別?

#{}是占位符&#xff0c;預編譯處理&#xff1b;${}是拼接符&#xff0c;字符串替換&#xff0c;沒有預編譯處理。 Mybatis在處理#{}時&#xff0c;#{}傳入參數是以字符串傳入&#xff0c;會將SQL中的#{}替換為?號&#xff0c;調用PreparedStatement的set方法來賦值。 Mybat…

DCTNet

DCTNet http://giantpandacv.com/academic/%E7%AE%97%E6%B3%95%E7%A7%91%E6%99%AE/%E9%A2%91%E5%9F%9F%E4%B8%AD%E7%9A%84CNN/CVPR%202020%20%E5%9C%A8%E9%A2%91%E5%9F%9F%E4%B8%AD%E5%AD%A6%E4%B9%A0%E7%9A%84DCTNet/ 一個對輸入圖像進行頻域轉換和選擇的方法&#xff0c;達到…

python實現手機號歸屬地查詢

手機上突然收到了某銀行的短信提示&#xff0c;看了一下手機的位數&#xff0c;正好是11位。我一想&#xff0c;這不就是標準的手機號碼嗎&#xff1f;于是一個想法涌上心頭——用python的庫實現查詢手機號碼歸屬地查詢自由。 那實現的效果如下&#xff1a; 注&#xff1a;電…

達夢數據庫基礎操作(一):用戶操作

達夢數據庫基礎操作(一)&#xff1a;用戶操作 1 達夢運行狀態 SELECT banner as 版本信息 FROM v$version;1.2 達夢版本號 SELECT banner as 版本信息 FROM v$version;1.3 用戶相關操作 默認用戶名密碼&#xff1a;SYSDBA/SYSDBA 注意&#xff1a;在哪個數據庫下創建的用戶…

2.3_3 進程互斥的硬件實現方法

文章目錄 2.3_3 進程互斥的硬件實現方法&#xff08;一&#xff09;中斷屏蔽方法&#xff08;二&#xff09;TestAndSet指令&#xff08;三&#xff09;Swap指令 總結&#xff08;四&#xff09;互斥鎖 2.3_3 進程互斥的硬件實現方法 學習提示&#xff1a; 1.理解各方法的原理 …