10-Python与设计模式--享元模式
一、網(wǎng)上咖啡選購(gòu)平臺(tái)
假設(shè)有一個(gè)網(wǎng)上咖啡選購(gòu)平臺(tái),客戶可以在該平臺(tái)上下訂單訂購(gòu)咖啡,平臺(tái)會(huì)根據(jù)用戶位置進(jìn)行線下配送。假設(shè)其咖啡對(duì)象構(gòu)造如下:
class Coffee:name = ''price =0def __init__(self,name):self.name = nameself.price = len(name)#在實(shí)際業(yè)務(wù)中,咖啡價(jià)格應(yīng)該是由配置表進(jìn)行配置,或者調(diào)用接口獲取等方式得到,此處為說(shuō)明享元模式,將咖啡價(jià)格定為名稱長(zhǎng)度,只是一種簡(jiǎn)化def show(self):print "Coffee Name:%s Price:%s"%(self.name,self.price)其對(duì)應(yīng)的顧客類如下:
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)按照一般的處理流程,用戶在網(wǎng)上預(yù)訂咖啡,其代表用戶的Customer類中生成一個(gè)Coffee類,直到交易流程結(jié)束。整個(gè)流程是沒(méi)有問(wèn)題的。如果,隨著網(wǎng)站用戶越來(lái)越多,單位時(shí)間內(nèi)購(gòu)買(mǎi)咖啡的用戶也越來(lái)越多,并發(fā)量越來(lái)越大,對(duì)系統(tǒng)資源的消耗也會(huì)越來(lái)越大,極端情況下,會(huì)造成宕機(jī)等嚴(yán)重后果。此時(shí),高效利用資源,就顯得非常重要了。
簡(jiǎn)單分析下業(yè)務(wù)流程,高并發(fā)下用戶數(shù)量增加,而該模型下,每個(gè)用戶點(diǎn)一杯咖啡,就會(huì)產(chǎn)生一個(gè)咖啡實(shí)例,如果一種咖啡在該時(shí)間內(nèi)被很多用戶點(diǎn)過(guò),那么就會(huì)產(chǎn)生很多同樣咖啡的實(shí)例。避免重復(fù)實(shí)例的出現(xiàn),是節(jié)約系統(tǒng)資源的一個(gè)突破口。類似于單例模式,我們這里在咖啡實(shí)例化前,增加一個(gè)控制實(shí)例化的類:咖啡工廠。
咖啡工廠中,getCoffeeCount直接返回當(dāng)前實(shí)例個(gè)數(shù)。Customer類可以重寫(xiě)下,如下:
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)假設(shè)業(yè)務(wù)中短時(shí)間內(nèi)有多人訂了咖啡,業(yè)務(wù)模擬如下:
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
根據(jù)結(jié)果可以得知,該模式下三個(gè)用戶點(diǎn)了兩種咖啡,最終的咖啡實(shí)例為2,而不是3。
二、享元模式
享元模式定義如下:使用共享對(duì)象支持大量細(xì)粒度對(duì)象。大量細(xì)粒度的對(duì)象的支持共享,可能會(huì)涉及這些對(duì)象的兩類信息:內(nèi)部狀態(tài)信息和外部狀態(tài)信息。內(nèi)部狀態(tài)信息就是可共享出來(lái)的信息,它們存儲(chǔ)在享元對(duì)象內(nèi)部,不會(huì)隨著特定環(huán)境的改變而改變;外部狀態(tài)信息就不可共享的信息了。享元模式中只包含內(nèi)部狀態(tài)信息,而不應(yīng)該包含外部狀態(tài)信息。這點(diǎn)在設(shè)計(jì)業(yè)務(wù)架構(gòu)時(shí),應(yīng)該有所考慮。
三、享元模式的優(yōu)點(diǎn)和使用場(chǎng)景
優(yōu)點(diǎn):
1、減少重復(fù)對(duì)象,大大節(jié)約了系統(tǒng)資源。
使用場(chǎng)景:
1、系統(tǒng)中存在大量的相似對(duì)象時(shí),可以選擇享元模式提高資源利用率。咖啡訂購(gòu)平臺(tái)比較小,若假設(shè)一個(gè)電商平臺(tái),每個(gè)買(mǎi)家和賣(mài)家建立起買(mǎi)賣(mài)關(guān)系后,買(mǎi)家對(duì)象和賣(mài)家對(duì)象都是占用資源的。如果一個(gè)賣(mài)家同時(shí)與多個(gè)買(mǎi)家建立起買(mǎi)賣(mài)關(guān)系呢?此時(shí)享元模式的優(yōu)勢(shì)就體現(xiàn)出來(lái)了;
2、需要緩沖池的場(chǎng)景中,可以使用享元模式。如進(jìn)程池,線程池等技術(shù),就可以使用享元模式(事實(shí)上,很多的池技術(shù)中已經(jīng)使得了享元模式)。
四、享元模式的缺點(diǎn)
1、享元模式雖然節(jié)約了系統(tǒng)資源,但同時(shí)也提高了系統(tǒng)的復(fù)雜性,尤其當(dāng)遇到外部狀態(tài)和內(nèi)部狀態(tài)混在一起時(shí),需要先將其進(jìn)行分離,才可以使用享元模式。否則,會(huì)引起邏輯混亂或業(yè)務(wù)風(fēng)險(xiǎn);
2、享元模式中需要額外注意線程安全問(wèn)題。
轉(zhuǎn)載于:https://www.cnblogs.com/jokezl/p/10227232.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的10-Python与设计模式--享元模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 日三省吾身
- 下一篇: java B2B2C Springclo