Python與設計模式--享元模式

10-Python與設計模式–享元模式

一、網上咖啡選購平臺

假設有一個網上咖啡選購平臺,客戶可以在該平臺上下訂單訂購咖啡,平臺會根據用戶位置進行
線下配送。假設其咖啡對象構造如下:

class Coffee:name = ''price =0def __init__(self,name):self.name = nameself.price = len(name) # 在實際業務中,咖啡價格應該是由配置表進行配置,或者調用接口獲取等方式得到,# 此處為說明享元模式,將咖啡價格定為名稱長度,只是一種簡化def show(self):print "Coffee Name:%s Price:%s"%(self.name,self.price)

其對應的顧客類如下:

class Customer:name=""def __init__(self,name):self.name=namedef order(self,coffee_name):print "%s ordered a cup of coffee:%s"%(self.name,coffee_name)return Coffee(coffee_name)
按照一般的處理流程,用戶在網上預訂咖啡,其代表用戶的Customer類中生成一個Coffee類,
直到交易流程結束。整個流程是沒有問題的。如果,隨著網站用戶越來越多,單位時間內購買咖啡的用戶
也越來越多,并發量越來越大,對系統資源的消耗也會越來越大,極端情況下,會造成宕機等嚴重后果。
此時,高效利用資源,就顯得非常重要了。簡單分析下業務流程,高并發下用戶數量增加,而該模型下,每個用戶點一杯咖啡,就會產生一個咖啡實例,
如果一種咖啡在該時間內被很多用戶點過,那么就會產生很多同樣咖啡的實例。避免重復實例的出現,
是節約系統資源的一個突破口。類似于單例模式,我們這里在咖啡實例化前,增加一個控制實例化的類:
咖啡工廠。
class CoffeeFactory():coffee_dict = {}def getCoffee(self, name):if self.coffee_dict.has_key(name) == False:self.coffee_dict[name] = Coffee(name)return self.coffee_dict[name]def getCoffeeCount(self):return len(self.coffee_dict)

咖啡工廠中,getCoffeeCount直接返回當前實例個數。Customer類可以重寫下,如下:

class Customer:coffee_factory=""name=""def __init__(self,name,coffee_factory):self.name=nameself.coffee_factory=coffee_factorydef order(self,coffee_name):print "%s ordered a cup of coffee:%s"%(self.name,coffee_name)return self.coffee_factory.getCoffee(coffee_name)

假設業務中短時間內有多人訂了咖啡,業務模擬如下:

if __name__=="__main__":coffee_factory=CoffeeFactory()customer_1=Customer("A Client",coffee_factory)customer_2=Customer("B Client",coffee_factory)customer_3=Customer("C Client",coffee_factory)c1_capp=customer_1.order("cappuccino")c1_capp.show()c2_mocha=customer_2.order("mocha")c2_mocha.show()c3_capp=customer_3.order("cappuccino")c3_capp.show()print "Num of Coffee Instance:%s"%coffee_factory.getCoffeeCount()

打印如下:

A Client ordered a cup of coffee:cappuccino Coffee Name:cappuccino
Price:10 B Client ordered a cup of coffee:mocha Coffee Name:mocha
Price:5 C Client ordered a cup of coffee:cappuccino Coffee
Name:cappuccino Price:10 Num of Coffee Instance:2

根據結果可以得知,該模式下三個用戶點了兩種咖啡,最終的咖啡實例為2,而不是3。

二、享元模式

享元模式定義如下:使用共享對象支持大量細粒度對象。大量細粒度的對象的支持共享,可能會涉及這些對象的
兩類信息:內部狀態信息和外部狀態信息。內部狀態信息就是可共享出來的信息,它們存儲在享元對象內部,
不會隨著特定環境的改變而改變;外部狀態信息就不可共享的信息了。享元模式中只包含內部狀態信息,
而不應該包含外部狀態信息。這點在設計業務架構時,應該有所考慮。

三、享元模式的優點和使用場景

優點:
1、減少重復對象,大大節約了系統資源。使用場景:
1、系統中存在大量的相似對象時,可以選擇享元模式提高資源利用率。咖啡訂購平臺比較小,若假設一個電商平臺,每個買家和賣家建立起買賣關系后,買家對象和賣家對象都是占用資源的。如果一個賣家同時與多個買家建立起買賣關系呢?此時享元模式的優勢就體現出來了;
2、需要緩沖池的場景中,可以使用享元模式。如進程池,線程池等技術,就可以使用享元模式(事實上,很多的池技術中已經使得了享元模式)。

四、享元模式的缺點

1、享元模式雖然節約了系統資源,但同時也提高了系統的復雜性,尤其當遇到外部狀態和內部狀態混在一起時,需要先將其進行分離,才可以使用享元模式。否則,會引起邏輯混亂或業務風險;
2、享元模式中需要額外注意線程安全問題。

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

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

相關文章

Go iota簡介

當聲明枚舉類型或定義一組相關常量時,Go語言中的iota關鍵字可以幫助我們簡化代碼并自動生成遞增的值。本文檔將詳細介紹iota的用法和行為。 iota關鍵字 iota是Go語言中的一個預定義標識符,它用于創建自增的無類型整數常量。iota的行為類似于一個計數器…

數據庫基礎入門 — SQL排序與分頁

我是南城余!阿里云開發者平臺專家博士證書獲得者! 歡迎關注我的博客!一同成長! 一名從事運維開發的worker,記錄分享學習。 專注于AI,運維開發,windows Linux 系統領域的分享! 本…

[深度理解] 重啟 Splunk Search Head Cluster

1: 背景: 關于釋放Splunk search head 的job 運行壓力:splunk search head cluster 要重啟的話,怎么辦? 答案是:splunk rolling-restart shcluster-members Initiate a rolling restart from the command line Invoke the splunk rolling-restart command from any me…

3款免費次數多且功能又強大的國產AI繪畫工具

hi,同學們,本期是我們第55 期 AI工具教程 最近兩個月,國內很多AI繪畫軟件被關停,國外絕大部分AI繪畫工具費用不低,因此 這兩天我 重新整理 國產 AI繪畫 工具 , 最終 篩選了 3款功能強大&#xf…

LeeCode前端算法基礎100題(3)- N皇后

一、問題詳情: 按照國際象棋的規則,皇后可以攻擊與之處在同一行或同一列或同一斜線上的棋子。 n 皇后問題 研究的是如何將 n 個皇后放置在 nn 的棋盤上,并且使皇后彼此之間不能相互攻擊。 給你一個整數 n ,返回所有不同的 n 皇后…

虛擬機系列:vmware和Oracle VM VirtualBox虛擬機的區別,簡述哪一個更適合我?以及相互轉換

一. VMware和Oracle VM VirtualBox虛擬機的區別主要體現在以下幾個方面: 首先兩種軟件的安裝使用教程如下: VMware ESXI 安裝使用教程 Oracle VM VirtualBox安裝使用教程 商業模式:VMware是一家商業公司,而Oracle VM VirtualBox是開源軟件; 功能:VMware擁有更多的功能和…

Leetcode200. 島嶼數量

Every day a Leetcode 題目來源:200. 島嶼數量 解法1:深度優先搜索 設目前指針指向一個島嶼中的某一點 (i, j),尋找包括此點的島嶼邊界。 從 (i, j) 向此點的上下左右 (i1,j),(i-1,j),(i,j1),(i,j-1) …

“圓柱-計算公式“技術支持網址

該軟件可以計算圓柱的底面圓周長、底面積、側面積和體積。 您在使用中有遇到任何問題都可以和我們聯系。我們會在第一時間回復您。 郵箱地址:elmo30zeongmail.com 謝謝!

如何將本地websocket發布至公網并實現遠程訪問?

本地websocket服務端暴露至公網訪問【cpolar內網穿透】 文章目錄 本地websocket服務端暴露至公網訪問【cpolar內網穿透】1. Java 服務端demo環境2. 在pom文件引入第三包封裝的netty框架maven坐標3. 創建服務端,以接口模式調用,方便外部調用4. 啟動服務,出現以下信息表示啟動成功…

VR云游:讓旅游產業插上數字化翅膀,打造地方名片

自多地入冬降溫以來,泡溫泉成了許多人周末度假的選擇,在氣溫持續走低的趨勢下,溫泉游也迎來了旺季;但是依舊有些地區溫度依舊溫暖,例如南京的梧桐美景也吸引了不少游客前去打卡,大家穿著漢服與金黃的樹葉合…

【AI考證筆記】NO.1人工智能的基礎概念

以下部分內容來自于百度智能云人才認證培訓講義,騰訊等也有人工智能類似的講義,限時免費,也就是不報考,也能系統學習,課程做的都是不錯的。有感興趣的朋友,可以去檢索學習。 本系列是學習筆記,…

6個常用的聚類評價指標

評估聚類結果的有效性,即聚類評估或驗證,對于聚類應用程序的成功至關重要。它可以確保聚類算法在數據中識別出有意義的聚類,還可以用來確定哪種聚類算法最適合特定的數據集和任務,并調優這些算法的超參數(例如k-means中的聚類數量…

C語言——從鍵盤輸人三角形的三個邊長 a、b、c,求出三角形的面積。

從鍵盤輸人三角形的三個邊長 a、b、c,求出三角形的面積。求三角形的面積用公式areasqrt(s*(s-a)*(s-b)*(s-c)),其中 s1/2(a十bc)。注:要求對輸人三角形的三個邊長做出有效性判斷。 #define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> #include<math.h> int main…

從word復制內容到wangEditor富文本框的時候會把html標簽也復制過來,如果只想實現直接復制純文本,有什么好的實現方式

從word復制內容到wangEditor富文本框的時候會把html標簽也復制過來&#xff0c;如果只想實現直接復制純文本&#xff0c;有什么好的實現方式&#xff1f; 將 Word 中的內容復制到富文本編輯器時&#xff0c;常常會帶有大量的 HTML 標簽和樣式&#xff0c;這可能導致不必要的格式…

前置微小信號放大器在生物醫學中有哪些應用

前置微小信號放大器在生物醫學領域中具有廣泛的應用。生物醫學信號通常具有較小的振幅和較低的幅頻響應&#xff0c;因此需要借助放大器來增強信號以便進行準確的測量、監測和分析。以下是前置微小信號放大器在生物醫學中的主要應用。 心電圖&#xff08;ECG&#xff09;放大器…

Spring第一課,了解IDEA里面的文件,回顧Cookie和Session,獲取Session,Cookie,Header的方式

目錄 IDEA第一課&#xff08;熟悉里面內容&#xff09; 建立連接 -RequestMapping 路由映射 請求 1.傳遞單個參數?編輯 2.多個參數?編輯 3.傳遞數組 4.傳遞一個集合&#xff0c;但是這里我們傳遞的時候發生了500的錯誤 簡單介紹JSON 回顧Cookie和S…

js檢測dom變化的方法:MutationObserver

前言 檢測一個原生dom的變化,如一個div的顏色,大小,所在位置,內部元素的屬性是否變化,更深層dom樹上的變化等等。 都可以使用一個window上暴露出來的一個api:MutationObserver 語法 官方地址:MutationObserver.MutationObserver() - Web API 接口參考 | MDN 使用new Mutat…

【大數據】Docker部署HMS(Hive Metastore Service)并使用Trino訪問Minio

本文參考鏈接置頂&#xff1a; Presto使用Docker獨立運行Hive Standalone Metastore管理MinIO&#xff08;S3&#xff09;_hive minio_BigDataToAI的博客-CSDN博客 一. 背景 團隊要升級大數據架構&#xff0c;需要摒棄hadoop&#xff0c;底層使用Minio做存儲&#xff0c;應用…

干貨 | 攜程酒店基于血緣元數據的數據流程優化實踐

作者簡介 九號&#xff0c;攜程數據技術專家&#xff0c;關注數據倉庫架構、數據湖、流式計算、數據治理。 一、背景 元數據MetaData狹義的解釋是用來描述數據的數據&#xff0c;廣義的來看&#xff0c;除了業務邏輯直接讀寫處理的那些業務數據&#xff0c;所有其它用來維持整個…

kafka詳細講解與安裝

Kafka是一種分布式流處理平臺&#xff0c;具有高吞吐量、可擴展性和容錯性。它最初由LinkedIn開發&#xff0c;現已成為Apache軟件基金會的頂級項目。Kafka廣泛應用于實時數據流處理、日志收集、消息隊列等場景。 以下是關于Kafka的簡要講解和安裝步驟&#xff1a; 一、Kafka…