詳解iOS App設計模式開發中對於享元模式的運用

2022-09-25 03:33:09 字數 3336 閱讀 8143

享元模式的概念

在物件導向軟體設計中,利用公共物件不僅能節省資源還能提高效能。共享的物件只能提供某些內在的資訊,而不能用來識別物件。專門用於設計可共享物件的一種設計模式叫做享元模式(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.即使你不使用直接設計模式,避免龐大的繼承體系也會導致改...