享元模式定義是它使用共享物件,用來盡可能減少記憶體使用量以及分享資訊給盡可能多的相似物件;它適合用於只是因重複而導致使用無法令人接受的大量記憶體的大量物件。通常物件中的部分狀態是可以分享。常見做法是把它們放在外部資料結構,當需要使用時再將它們傳遞給享元
從享元模式定義來看,跟單例模式有相同之處,
單例模式(singleton)的定義:是為了確保乙個類只能產生乙個例項,從而節省物件建立所花費的時間,從而對系統記憶體使用頻率也會減低。
享元模式(flyweight)的定義:是為系統中存在多個相同的物件,那麼只需要共享乙個物件的拷貝
我們直接從例子來說起吧:
定義乙個person
類,裡面有乙個方法buy_car
,然後定義乙個car
類
class
car:
def__init__
(self,type):
self.type = type
class
person:
def__init__
(self,name):
self.name = name
defbuy_car
(self,type):
return car(type)
接下來我們進行測試,構造2個person
類物件,物件小王,購買寶馬2輛,物件小李,購買奧迪2輛,**如下:
p1 = person("小王")
bmw1 = car("寶馬")
bmw2 = car("寶馬")
p1.buy_car(bmw1)
p1.buy_car(bmw2)
print
(id(bmw1),id(bmw2))
p2 = person
("小李")
aodi1 = car
("奧迪")
aodi2 = car
("奧迪")
p2.buy_car
(aodi1)
p2.buy_car
(aodi2)
print
(id(aodi1),id(aodi2))
小王購買2輛寶馬,**是構造了2個car
類物件,小李購買奧迪也是同樣,這樣隨著人數的增加,無疑對記憶體的開銷產生了浪費,這4輛車car
物件分別佔著不同的記憶體空間,我們看輸出結果如下:
66133648 66133680
66133744 66133808
那麼享元模式就是解決類似的問題的,小王購買寶馬型汽車,是同乙個車型,我們可以只在記憶體中生成乙個物件,我們稍加修改如上**
class
car:
def__init__
(self, type):
self.type = type
class
factory:
car_type_list = {}
defget_car
(self, name):
ifnot self.car_type_list.get(name):
self.car_type_list[name] = car(name)
else:
self.car_type_list.get(name)
return self.car_type_list.get(name)
defget_leng
(self):
return len(self.car_type_list)
class
person
(factory):
def__init__
(self, name):
self.name = name
我加了乙個工廠類factory
,定義乙個類變數car_type_list
,用來存放每種汽車型號的鍵值對
格式如下:
然後person
類繼承factory
類,如果已經存在寶馬車型,就直接從字典返回,如果字典沒有就去構造鍵值對,新增字典
以下是我們的測試結果:
84942320 84942320
84942384 84942384
2
三、享元模式的優點和使用場景
優點:1、減少重複物件,大大節約了系統資源。
使用場景:
1、系統中存在大量的相似物件時,可以選擇享元模式提高資源利用率。咖啡訂購平台比較小,若假設乙個電商平台,每個買家和賣家建立起買賣關係後,買家物件和賣家物件都是占用資源的。如果乙個賣家同時與多個買家建立起買賣關係呢?此時享元模式的優勢就體現出來了;
2、需要緩衝池的場景中,可以使用享元模式。如程序池,執行緒池等技術,就可以使用享元模式(事實上,很多的池技術中已經使得了享元模式)。
四、享元模式的缺點
1、享元模式雖然節約了系統資源,但同時也提高了系統的複雜性,尤其當遇到外部狀態和內部狀態混在一起時,需要先將其進行分離,才可以使用享元模式。否則,會引起邏輯混亂或業務風險;
2、享元模式中需要額外注意執行緒安全問題。
Python設計模式 享元模式
基於python3.5.2,如下 coding utf 8 class coffee name price 0 def init self,name self.name name self.price len name defshow self print coffee name s price s...
Python設計模式 享元模式
享元模式 運用共享技術有效地支援大量細粒度物件的復用。享元物件關鍵是區分內部狀態和外部狀態 內部狀態 儲存在物件內部並且不會隨著環境改變而改變的狀態 外部狀態 隨著環境改變而改變的 不可以共享的狀態,外部狀態並且有客戶端儲存,通過客戶端在需要的時候傳入到物件內部。from abc import ab...
設計模式(享元模式)
享元模式是設計模式中少數幾個已提高系統效能為目的模式之一。它的核心思想是 如果系統存在多個 相同的物件,那麼只需要共享一分物件的拷貝,而不必為每一次使用都建立新的物件。當有物件被大量復用時,特別是重量級的物件復用可以使用享元模式來提高系統效能。其優點如下 1.可以節省重複建立物件的開銷,因為被享元模...