享元模式的概念
在物件導向軟體設計中,利用公共物件不僅能節省資源還能提高效能。共享的物件只能提供某些內在的資訊,而不能用來識別物件。專門用於設計可共享物件的一種設計模式叫做享元模式(flyweight pattwww.cppcns.comern)。
實現享元模式需要兩個關鍵元件,通常是可共享的享元物件和儲存他們的池。某種**物件維護這個池,並從它返回適當的例項。
運用共享技術有效地支援大量細粒度的物件。
公共運輸(如公共汽車)已有一百多年的歷史了。大量去往相同方向的乘客可以分擔保有和經營車輛(如公共汽車)的費用。公共汽車有多個站台,乘客沿著路線在接近他們目的地的地方上下車。到達目的地的費用僅與行程有關。跟保有車輛相比,乘坐公共汽車要便宜得多。這就是利用公共資源的好處。
在物件導向軟體設計中,我們利用公共物件不僅能節省資源還能提高效能。比方說,某個人物需要乙個類的一百萬個例項,但我們可以把這個類的乙個例項讓大家共享,而把某些獨特的資訊放在外部,節省的資源可能相當可觀(乙個例項與一百萬個例項的差別)。共享的物件只提供某些內在的資訊,而不能用來識別物件。專門用於設計可共享物件的一種設計模式叫做享元模式。
使得享元物件是輕量級的最重要原因是什麼呢?不是它們的大小,而是通過共享能夠節省的空間總量。某些物件的獨特狀態可以拿到外部,在別處管理,其餘部分被共享。比如說,原來需要乙個類的一百萬個物件,但因為這個類的物件為享元,現在只要乙個就夠了。這就是由於可共享的享元物件讓整個系統變得輕量的原因。通過仔細的設計,記憶體的節省非常可觀。在ios開發中,節省記憶體意味著提公升整體效能。
享元模式的例項應用
我們建立乙個websitefactory工廠類,來維護池中的享元物件,根據父型別返回各種型別的具體享元物件,**如下:
複製** **如下:
#import
#import "websiteprotocol.h"
@inte***ce websitefactory : nsobject
@property (nonatomic, strong) nsdictionary *flyweights; //共享物件
- (id)getwebsitecategory:(nsstring *)webkey;
- (nsintewww.cppcns.comger)getwebsitecount;
@end
複製** **如下:
#import "websitefactory.h"
#imlonopheport "concretewebsite.h"
@implementation websitefactory
- (instancetype)init
return self;}
- (id)getwebsitecategory:(nsstring *)webkey
}];if (webset == nil)
return webset;}
- (nsinteger)getwebsitecount
@end
**中的getwebsitecategory方法可以返回具體的享元物件,返回的這個享元物件同時遵守websiteprotocol的協議,websiteprotocol的**如下:
複製** **如下:
#import
#import "user.h"
@protocol websiteprotocol
- (void)use:(user *)user;
@end
concretewebsite的**如下:
複製** **如下:
#import
#import "websiteprotocol.h"
@inte***ce concretewebsite : nsobject
@property (nonatomic, copy) nsstring *we
@end
複製** **如下:
#import "concretewebsite.h"
@implementation concretewebsite
- (void)use:(user *)user
@end
user的**如下:
複製** **如下:
#import
@inte***ce user : nsobject
@property (nonatomic, copy) nsstring *username;
@end
複製** **如下:
#import "user.h"
@implementation user
@end
至此,享元模式的**已經完成了,我們來看下在客戶端怎麼使用享元模式,**如下:
複製** **如下:
#import "viewcontroller.h"
#import "websiteprotocol.h"
#import "websitefactory.h"
#import "concretewebsite.h"
#import "user.h"
typedef id websitetype;
@inte***ce viewcontroller ()
@end
複製** **如下:
@implementation viewcontroller
- (void)viewdidload
- (void)didreceivememorywarning
@end
輸出如下:
2015-09-12 15:59:55.322 flyweightpattern[42020:1723017] **分類:首頁 使用者名字:張三
2015-09-12 15:59:55.322 flyweightpattern[42020:1723017] **分類:商店 使用者名字:李四
2015-09-12 15:59:55.322 flyweightpattern[42020:1723017] **分類:案例 使用者名字:王五
2015-09-12 15:59:55.323 flyweightpattern[42020:1723017] 個數: 3
分享相同的資源以執行任務,可能比使用個人的資源完成同樣的事情更加高效。享元模式可以通過共享一部分必需的物件,來節省大量的記憶體。
何時使用享元模式
(1)應用程式使用很多物件;
(2)在記憶體中儲存物件會影響記憶體效能;
(3)物件的多數特有狀態(外在狀態)可以放到外部而輕量化;
(3)移除了外在狀態後,可以用較少的共享物件替代原來的那組物件;
(4)應用程式不依賴於物件標示,因為共享物件不能提供唯一的標示。
本文標題: 詳解ios app設計模式開發中對於享元模式的運用
本文位址:
iOS App開發 最好的設計和開發工具
眾所周知,ios是乙個作業系統,由蘋果公司設計與開發而且依靠蘋果硬體執行,如iphone ipad和ipod。設計該作業系統最初的想法是開發乙個介面,可在小屏手機上較為容易地執行應用程式。因此iphone派上用場。像其他的任意一款移動作業系統,iphone提供使用者可使用的應用程式。早期版本中,應用...
23中設計模式詳解 單利模式
單例模式 保證一類只有乙個例項,並且對外提供訪問該類例項的全域性訪問點 應用場景 優點 單利只產生乙個例項,減少了系統效能的開銷,當乙個物件的產生需要較多資源的時候,就會利用單利來駐留 package com.spongeli.signleton 單列模式 餓漢式 特點 執行緒安全,效率高,但是沒有...
設計模式詳解 設計模式簡介
乙個模式應該包括的方面 模式的名稱 模式的目的 模式的實現 模式的約束 為什麼要學習設計模式?1.利用解決方案 2.建立通用術語,方便交流 3.對於問題,設計過程和物件導向,模式給你乙個更高層次的視角,這樣的視角將你從過早處理細節中解放出來。4.即使你不使用直接設計模式,避免龐大的繼承體系也會導致改...