在軟體系統中,有時候會存在資源浪費的情況,例如在計算機記憶體中儲存了多個完全相同或者非常相似的物件,如果這些物件的數量太多將導致系統執行代價過高,記憶體屬於計算機的"稀缺資源",不應該用來"隨便浪費",那麼是否存在一種技術可以用於節約記憶體使用空間,實現對這些相同或者相似物件的共享訪問呢?答案是肯定,這種技術就是我們本章將要學習的享元模式。
享元模式(flyweight pattern)主要用於減少建立物件的數量,以減少記憶體占用和提高效能。這種型別的設計模式屬於結構型模式,它提供了減少物件數量從而改善應用所需的物件結構的方式。
享元模式是設計模式中少數幾個以提高系統效能為目的的模式之一享元模式的主要角色由享元工廠、抽象享元、具體享元類和主函式幾部分組成
flyweight:抽象享元類.所有具體享元類的超類或者介面,通過這個介面,flyweight可以接受並作用於外部專題享元模式的核心在於享元工廠類,享元工廠類的作用在於提供乙個用於儲存享元物件的享元池,使用者需要物件時,首先從享元池中獲取,如果享元池中不存在,則建立乙個新的享元物件返回給使用者,並在享元池中儲存該新增物件。concreteflyweight:具體享元類.指定內部狀態,為內部狀態增加儲存空間
unsharedconcreteflyweight:非共享具體享元類,指出那些不需要共享的flyweight子類
flyweightfactory:享元工廠,主要用來建立並管理共享的享元物件,並對外提供訪問共享享元的介面
享元模式以共享的方式高效地支援大量的細粒度物件,享元物件能做到共享的關鍵是區分內部狀態(internal state)和外部狀態(external state)
場景:構建不同顏色的圓,弧,方形,共享的是形狀,外部動態修改的是形狀的顏色
先建立乙個享元物件
@inte***ce shape : nsobject
/**/
@property (nonatomic,strong) nsstring *shapename;
- (void)shapeshowcolor:(nsstring *)color;
@end
@inte***ce shape()
/**/
@property (nonatomic,strong) nsstring *shapecolor;
@end
@implementation shape
- (void)shapeshowcolor:(nsstring *)color
@end
建立享元工廠
@implementation shapefactory
- (shape *)shapewithtype:(shapetype)type
//從享元池取
shape *shape =[self.shapepools objectforkey:@(type)];
if (!shape)
self.shapepools[@(type)] = shape;
}return shape;
}
客戶端使用
shapefactory *factory = [[shapefactory alloc] init];
shape *circle = [factory shapewithtype:kcircle];
shape *circle1 = [factory shapewithtype:kcircle];
[circle shapeshowcolor:@"藍色"];
[circle1 shapeshowcolor:@"白色"];
結果:
可以看出列印的是同一物件.
其實最經典的例子應該是圍棋的棋子,共享的應該是這個棋子的形狀、大小、,外部動態修改的應該是棋子的位置。那麼,只要定義兩個類,黑棋和白棋,而且工廠中或說整個系統中也就只維護兩個物件,乙個是黑棋乙個是白棋。大家可以實踐一下
享元模式設計的重點在於分離變與不變,把乙個物件的狀態分成內部和外部狀態,內部狀態是不變的,外部狀態是可變的.然後通過共享不變的部分,達到減少物件數量、並節約記憶體的目的。在享元物件需要的時候,可以從外部傳入外部狀態給共享的物件,共享物件會在功能處理的時候,使用自己內部的狀態和這些外部的狀態。
在享元模式中,為了建立和管理共享的享元部分,引入享元工廠,享元工廠中一般都包含有享元物件的例項池,享元物件就是快取在這個例項池中的.
並且享元物件的初始化也是在第一次向享元工廠請求獲取共享物件的時候,進行共享物件的初始化,而且多半都是在享元工廠內部實現,不會從外部傳入共享物件。
結構型模式之享元模式
享元模式 享元模式結構 flyweight 抽象享元類 通常是乙個介面或抽象類,在抽象享元類中宣告了具體享元類公共的方法,這些方法可以向外界提供享元物件的內部資料 內部狀態 同時也可以通過這些方法設定外部資料 外部狀態 concreteflyweight 具體享元類 它實現了抽象享元類,其實例稱為享...
結構型模式之享元模式
定義 享元模式 flyweight pattern 運用共享技術有效地支援大量細粒度的物件。型別 結構型模式。適用情況 乙個應用程式有大量的物件。物件的大多數狀態都是外部的。如果刪除物件的外部狀態,可以和相對較少的共享物件取代很多組物件。應用程式不依賴物件的標識,即應用程式依賴於物件的抽象介面。概述...
結構型模式之享元模式
定義 享元模式 flyweight pattern 運用共享技術有效地支援大量細粒度的物件。型別 結構型模式。適用情況 乙個應用程式有大量的物件。物件的大多數狀態都是外部的。如果刪除物件的外部狀態,可以和相對較少的共享物件取代很多組物件。應用程式不依賴物件的標識,即應用程式依賴於物件的抽象介面。概述...