基於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"%(self.name,self.price))
class
customer:
name = ""
coffee_factory = ""
def__init__
(self,name,coffee_factory):
self.name = name
self.coffee_factory = coffee_factory
deforder
(self,coffee_name):
print("%s order a cup of coffee:%s" % (self.name, coffee_name))
return self.coffee_factory.getcoffee(coffee_name)
class
coffeefactory
(): coffee_dict = {}
defgetcoffee
(self,name):
if self.coffee_dict.get(name,false) == false:
self.coffee_dict[name] = coffee(name)
return self.coffee_dict[name]
defgetcoffeecount
(self):
return len(self.coffee_dict)
if __name__ == "__main__":
coffee_factory = coffeefactory()
customer1 = customer("client 1",coffee_factory).order("coffee1")
customer2 = customer("client 2", coffee_factory).order("coffee1")
customer3 = customer("client 3", coffee_factory).order("coffee2")
customer4 = customer("client 4", coffee_factory).order("coffee3")
print("coffeefactory中coffee的例項物件數",coffee_factory.getcoffeecount())
運用共享技術有效支援大量細粒度物件。在享元物件內部並且不會隨環境改變而改變的共享部分,可以稱為是享元物件的內部物件,而隨環境改變而改變的、不可以共享的狀態就是外部狀態了。享元模式可以避免大量非常相似類的開銷。在程式設計中,有時需要生成大量細粒度的類例項來表示資料。如果能發現這些例項除了幾個引數外基本相同的,有時就能夠大幅度減少需要例項化的類的數量,如果能把這些引數移到類例項的外面,在方法呼叫時將他們傳遞進來,就可以通過共享大幅度減少單個例項的數目。
1、系統中存在大量的相似物件時,可以選擇享元模式;
2、需要緩衝池的場景中,如程序池、執行緒池等技術。
**中,模擬了不同使用者來下訂單購買咖啡的場景,咖啡店中可供選擇的咖啡型別有限,由於顧客每個都不同,在生成訂單買咖啡時,需要生成咖啡例項,如果同乙個種類咖啡被不同顧客訂購時,會生成多個例項,此時就應用享元模式對該場景應用進行改造。
1、在coffee類中,包含了coffee的名稱和**;
2、用coffeefactory類來管理coffee類,類通過getcoffee()來確保同乙個種類的coffee只生成一次。
3、在customer類中,初始化時將coffeefactory物件傳入,當customer呼叫order()方法時,通過coffeefactory物件的getcoffee()方法來獲得coffee物件,從而達到物件共享的目的。
client 1 order a cup of coffee:coffee1
client 2 order a cup of coffee:coffee1
client 3 order a cup of coffee:coffee2
client 4 order a cup of coffee:coffee3
coffeefactory中coffee的例項物件數 3
通過執行結果,顯示工廠類中只生成了三個coffee物件,不同的顧客實現了對coffee物件的共享。
優點:
1、減少重複物件,節約系統資源。
缺點:1、雖然節約了系統資源,但同時也提高了系統的複雜性,尤其當遇到外部狀態與內部狀態混在一起時,需要先將其分離,再使用享元模式。
2、享元模式需要注意執行緒安全問題。
class
flyweight
():def
operation
(self):
raise notimplementederror
class
concreteflyweight
(flyweight):
defoperation
(self):
print("實現operation")
class
flyweightfactory
(): flyweights = {}
def__init__
(self):
self.flyweights["a"] = concreteflyweight()
self.flyweights["b"] = concreteflyweight()
self.flyweights["c"] = concreteflyweight()
defgetflyweight
(self,key):
return self.flyweights[key]
if __name__ == "__main__":
f = flyweightfactory()
fa = f.getflyweight("a")
fa.operation()
fb = f.getflyweight("b")
fb.operation()
該實現方式,對不同的語言具有通用性。 python設計模式 享元模式
享元模式定義是它使用共享物件,用來盡可能減少記憶體使用量以及分享資訊給盡可能多的相似物件 它適合用於只是因重複而導致使用無法令人接受的大量記憶體的大量物件。通常物件中的部分狀態是可以分享。常見做法是把它們放在外部資料結構,當需要使用時再將它們傳遞給享元 從享元模式定義來看,跟單例模式有相同之處,單例...
Python設計模式 享元模式
享元模式 運用共享技術有效地支援大量細粒度物件的復用。享元物件關鍵是區分內部狀態和外部狀態 內部狀態 儲存在物件內部並且不會隨著環境改變而改變的狀態 外部狀態 隨著環境改變而改變的 不可以共享的狀態,外部狀態並且有客戶端儲存,通過客戶端在需要的時候傳入到物件內部。from abc import ab...
設計模式(享元模式)
享元模式是設計模式中少數幾個已提高系統效能為目的模式之一。它的核心思想是 如果系統存在多個 相同的物件,那麼只需要共享一分物件的拷貝,而不必為每一次使用都建立新的物件。當有物件被大量復用時,特別是重量級的物件復用可以使用享元模式來提高系統效能。其優點如下 1.可以節省重複建立物件的開銷,因為被享元模...