假設有一個網上咖啡選購平台,客戶可以在該平台上下訂單訂購咖啡,平台會根據使用者位置進行線下配送。假設其咖啡對象構造如下:
其對應的顧客類如下:
按照一般的處理流程,使用者在網上預訂咖啡,其代表使用者的customer類中生成一個coffee類,直到交易流程結束。整個流程是沒有問題的。如果,随着網站使用者越來越多,機關時間内購買咖啡的使用者也越來越多,并發量越來越大,對系統資源的消耗也會越來越大,極端情況下,會造成當機等嚴重後果。此時,高效利用資源,就顯得非常重要了。
簡單分析下業務流程,高并發下使用者數量增加,而該模型下,每個使用者點一杯咖啡,就會産生一個咖啡執行個體,如果一種咖啡在該時間内被很多使用者點過,那麼就會産生很多同樣咖啡的執行個體。避免重複執行個體的出現,是節約系統資源的一個突破口。類似于單例模式,我們這裡在咖啡執行個體化前,增加一個控制執行個體化的類:咖啡工廠。
咖啡工廠中,getcoffeecount直接傳回目前執行個體個數。customer類可以重寫下,如下:
假設業務中短時間内有多人訂了咖啡,業務模拟如下:
列印如下:
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
num of coffee instance:2
根據結果可以得知,該模式下三個使用者點了兩種咖啡,最終的咖啡執行個體為2,而不是3。
享元模式定義如下:使用共享對象支援大量細粒度對象。大量細粒度的對象的支援共享,可能會涉及這些對象的兩類資訊:内部狀态資訊和外部狀态資訊。内部狀态資訊就是可共享出來的資訊,它們存儲在享元對象内部,不會随着特定環境的改變而改變;外部狀态資訊就不可共享的資訊了。享元模式中隻包含内部狀态資訊,而不應該包含外部狀态資訊。這點在設計業務架構時,應該有所考慮。
優點:
1、減少重複對象,大大節約了系統資源。
使用場景:
1、系統中存在大量的相似對象時,可以選擇享元模式提高資源使用率。咖啡訂購平台比較小,若假設一個電商平台,每個買家和賣家建立起買賣關系後,買家對象和賣家對象都是占用資源的。如果一個賣家同時與多個買家建立起買賣關系呢?此時享元模式的優勢就展現出來了;
2、需要緩沖池的場景中,可以使用享元模式。如程序池,線程池等技術,就可以使用享元模式(事實上,很多的池技術中已經使得了享元模式)。
1、享元模式雖然節約了系統資源,但同時也提高了系統的複雜性,尤其當遇到外部狀态和内部狀态混在一起時,需要先将其進行分離,才可以使用享元模式。否則,會引起邏輯混亂或業務風險;
2、享元模式中需要額外注意線程安全問題。