1、關於享元模式編程
享元模式有點相似於單例模式,都是隻生成一個對象被共享使用。享元模式主要目的就是讓多個對象實現共享,減小沒必要要的內存消耗,將多對同一對象的訪問集中起來,沒必要爲每一個訪問者建立一個單獨的對象,以此來下降內存的消耗。設計
2、享元模式結構圖對象
由於享元模式結構比較複雜,通常結合工廠模式一塊兒使用,在它的結構圖中包含了一個享元工廠類。blog
在享元模式結構圖中包含以下幾個角色:接口
Flyweight(抽象享元類):一般是一個接口或抽象類,在抽象享元類中聲明瞭具體享元類公共的方法,這些方法能夠向外界提供享元對象的內部數據(內部狀態),同時也能夠經過這些方法來設置外部數據(外部狀態)。內存
ConcreteFlyweight(具體享元類):它實現了抽象享元類,其實例稱爲享元對象;在具體享元類中爲內部狀態提供了存儲空間。一般咱們能夠結合單例模式來設計具體享元類,爲每個具體享元類提供惟一的享元對象。垃圾回收
UnsharedConcreteFlyweight(非共享具體享元類):並非全部的抽象享元類的子類都須要被共享,不能被共享的子類可設計爲非共享具體享元類;當須要一個非共享具體享元類的對象時能夠直接經過實例化建立。請求
FlyweightFactory(享元工廠類):享元工廠類用於建立並管理享元對象,它針對抽象享元類編程,將各類類型的具體享元對象存儲在一個享元池中,享元池通常設計爲一個存儲「鍵值對」的集合(也能夠是其餘類型的集合),能夠結合工廠模式進行設計;當用戶請求一個具體享元對象時,享元工廠提供一個存儲在享元池中已建立的實例或者建立一個新的實例(若是不存在的話),返回新建立的實例並將其存儲在享元池中。程序
3、享元模式的實現方法
在享元模式中引入了享元工廠類,享元工廠類的做用在於提供一個用於存儲享元對象的享元池,當用戶須要對象時,首先從享元池中獲取,若是享元池中不存在,則建立一個新的享元對象返回給用戶,並在享元池中保存該新增對象。接下來,實現一個登錄的享元模式。
4、總結
從上面代碼和運行結果這能夠看到,同一個登錄者登錄時是 "享" 用同一個登錄者對象。在享元對象池中只有兩個對象。
享元模式優勢,在於外部狀態相對獨立,使得對象能夠在不一樣的環境中被複用(共享對象能夠適應不一樣的外部環境)。且享元模式可共享相同或類似的細粒度對象,從而減小了內存消耗,同時下降了對象建立與垃圾回收的開銷。
享元模式缺點,外部狀態由客戶端保存,共享對象讀取外部狀態的開銷可能比較大。享元模式要求將內部狀態與外部狀態分離,這使得程序的邏輯複雜化,同時也增長了狀態維護成本。