23种设计模式之享元模式
享元模式的定義
定義: 使用共享對象可有效的支持大量的細粒度的對象
通俗的說, 就是將類的通用屬性抽出來,建立對象池,以達到限制對象數(shù)量的效果
上面定義中要求細粒度對象, 那么不可避免的使得對象數(shù)量多且性質(zhì)相近, 我們將這些對象的信息分為兩個部分: 內(nèi)部狀態(tài)和外部狀態(tài)
說白了,內(nèi)部狀態(tài)就是每個對象都不同的屬性,外部狀態(tài)就是數(shù)量有限的屬性, 如性別只有男女等
享元模式的類圖如下:
?
其中的角色:
享元模式的目的在于運用共享技術(shù),使得一些細粒度的對象可以共享
抽象享元角色代碼:
?
抽象享元角色一般為抽象類,在實際項目中一般是一個實現(xiàn)類, 它是描述一類事物的方法.在抽象角色中,一般需把外部狀態(tài)和內(nèi)部狀態(tài)定義出來,避免子類的隨意擴展. 我們對外部狀態(tài)加上了final關(guān)鍵字, 防止意外發(fā)生.獲得外部狀態(tài), 無意修改了一下, 池就混亂了.
在程序開發(fā)中, 確認只需要一次賦值的屬性則設(shè)置為final類型,避免無意修改導(dǎo)致邏輯混亂.
具體享元角色代碼:
?
享元工廠代碼:
?
享元模式的應(yīng)用
享元模式的優(yōu)點和缺點:
享元模式是一個非常簡單的模式, 它可以大大減少應(yīng)用程序創(chuàng)建的對象,減低程序內(nèi)存的占用,增強程序的性能,但它同時也提高了系統(tǒng)復(fù)雜性,需要分離出外部狀態(tài)和內(nèi)部狀態(tài), 而且外部狀態(tài)具有固化特性,不應(yīng)該隨內(nèi)部狀態(tài)改變而改變,否則導(dǎo)致系統(tǒng)的邏輯混亂
享元模式的使用場景:
享元模式的擴展
1.線程安全的問題
當使用享元模式時, 對象池中的角色數(shù)量是一定的, 可能在拿的時候不同線程同時拿到同一個對象.這是就出現(xiàn)線程不安全的問題了
我們在使用享元模式時要注意這個問題. 我們在使用享元模式時,對象池中的享元對象盡量多, 多到足夠滿足業(yè)務(wù)為止
2.性能平衡
既然是面向?qū)ο缶幊? 我們何不將外部狀態(tài)抽離出來,定義為一個對象呢?
經(jīng)過測試, 外部狀態(tài)使用對象要比使用基本類型效率低. 所以, 外部狀態(tài)最好以Java的基本類型作為標志, 如stirng、int等, 可以大幅的提升效率
享元模式在Java API中也是隨處可見. 如Java的String就實現(xiàn)了對象池
需要說明一下的是,雖然可以使用享元模式實現(xiàn)對象池, 但是這兩者還是有比較大的差異, 對象池著重在對象的復(fù)用上,池中的每個對象是可替換的,從同一個池中獲得的A對象和B對象對客戶端來說是完全相同的,它主要解決復(fù)用,而享元模式主要解決對象的共享問題,如何建立多個可共享的細粒度對象是其關(guān)注的重點.
總結(jié)
以上是生活随笔為你收集整理的23种设计模式之享元模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 单例模式 redis_py
- 下一篇: 设计模式之规格模式