iOS設計模式 (四)享元模式
- 享元模式(英語:Flyweight Pattern)。使用共享物件,減少同一類物件的大量建立,儘可能減少記憶體使用量以及分享資訊給儘可能多的相似物件,運用共享技術有效地支援大量細粒度的物件。
享元模式UML
- 實現享元模式需要兩個關鍵元件,
1.可攻享享元物件
2.享元池
工廠是這一角色的理想候選。它可以通過一個工廠方法,根據父型別返回各種型別的具體享元物件,其主要的目的就是使用池中的享元物件,並適當地從中返回享元物件。
- 享元模式的使用場景
@:應用程式使用很多物件。
@:在記憶體中儲存物件會影響記憶體效能。
@:物件的多數特有狀態可以放到外部而輕量化。
@:移除了外在狀態後,可以用較少的共享物件替代原來的那組物件。
@:應用程式不依賴於物件標識,因為共享物件不能提供唯一的標識。
享元模式的例項應用
- User類
#import <Foundation/Foundation.h>
@interface User : NSObject
@property (nonatomic, copy)NSString *useName;
@end
#import "User.h"
@implementation User
@end
- FlySiteProtocol 協議
#import <Foundation/Foundation.h>
#import "User.h"
@protocol FlySiteProtocol <NSObject>
- (void)use:(User *)user;
@end
- ConcreteFlySite 類
#import <Foundation/Foundation.h>
#import "FlySiteProtocol.h"
@interface ConcreteFlySite : NSObject <FlySiteProtocol>
@property (nonatomic, copy) NSString *webName;
@end
#import "ConcreteFlySite.h"
@implementation ConcreteFlySite
- (void)use:(User *)user
{
NSLog(@"網站分類:%@ 使用者名稱字:%@", self.webName, user.useName);
}
@end
- FlyWeightFactory 工廠類
#import <Foundation/Foundation.h>
#import "FlySiteProtocol.h"
@interface FlyWeightFactory : NSObject
@property (nonatomic, strong) NSDictionary *flyweights; //共享物件
- (id <FlySiteProtocol>)flyWeightCategory:(NSString *) webKey;
- (NSInteger )getWebSiteCount;
@end
#import "FlyWeightFactory.h"
#import "ConcreteFlySite.h"
@implementation FlyWeightFactory
- (instancetype)init
{
self = [super init];
if (self) {
_flyweights= [NSDictionary dictionary];
}
return self;
}
- (id <FlySiteProtocol>)flyWeightCategory:(NSString *)webKey
{
__block id <FlySiteProtocol> webFlySet = nil;
[self.flyweights enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
if (webKey == key) {
webFlySet = obj;
* stop = YES;
}
}];
if (webFlySet == nil) {
ConcreteFlySite *concrete = [[ConcreteFlySite alloc] init];
concrete.webName = webKey;
webFlySet = concrete;
NSMutableDictionary *mutableDict = [NSMutableDictionary dictionaryWithDictionary:self.flyweights];
[mutableDict setObject:webFlySet forKey:webKey];
self.flyweights = [NSDictionary dictionaryWithDictionary:mutableDict];
}
return webFlySet;
}
- (NSInteger)getWebSiteCount {
return self.flyweights.count;
}
@end
- ViewController 類
#import "ViewController.h"
#import "FlyWeightFactory.h"
#import "ConcreteFlySite.h"
#import "User.h"
#import "FlySiteProtocol.h"
typedef id <FlySiteProtocol> WebsiteType;
@interface ViewController ()
@end
@implementation ViewController
- (NSArray *)testArray
{
NSMutableArray *array = [NSMutableArray array];
for (NSInteger i = 0; i < 5000; i ++) {
if (i %2 == 0) {
[array addObject:[NSString stringWithFormat:@"訂單%ld",(long)i]];
}
else {
[array addObject:[NSString stringWithFormat:@"訂單%ld",(long)i]];
}
}
return array;
}
- (void)viewDidLoad {
[super viewDidLoad];
// 通過工廠方法返回各種具體享元物件,維護池中的享元物件
FlyWeightFactory *factory = [[FlyWeightFactory alloc] init];
for (NSInteger i = 0; i < [self testArray].count; i++ ) {
WebsiteType type = [factory flyWeightCategory:[self testArray][i]];
User *user = [[User alloc] init];
user.useName = [NSString stringWithFormat:@"使用者%ld",i];
[type use:user];
}
// WebsiteType type1 = [factory flyWeightCategory:@"首頁"];
//
// NSLog(@"factroy=====:%ld",[factory getWebSiteCount]);
//
//// // 返回具體的享元物件
//
// User *user1 = [[User alloc] init];
// user1.useName = @"張三";
// // 享元物件都具有use方法
// [type1 use:user1];
//
// WebsiteType type2 = [factory flyWeightCategory:@"商店"];
// User *user2 = [[User alloc] init];
// user2.useName = @"李四";
// [type2 use:user2];
//
// NSLog(@"factroy111=====:%ld",[factory getWebSiteCount]);
}
@end
- demo地址:https://github.com/defuliu/FlyweightPattern.git
- 參考案例: http://www.mamicode.com/info-detail-1037340.html
- 對比下xcode的執行記憶體
相關文章
- 《設計模式四》觀察、組合、享元模式設計模式
- 設計模式----享元模式設計模式
- 設計模式-享元模式設計模式
- 設計模式之享元模式設計模式
- javascript設計模式享元模式JavaScript設計模式
- 設計模式(十七):享元模式設計模式
- 設計模式系列13–享元模式設計模式
- 極簡設計模式-享元模式設計模式
- Python設計模式-享元模式Python設計模式
- Java設計模式11——享元模式Java設計模式
- 軟體設計模式————(享元模式)設計模式
- C#設計模式(13)——享元模式C#設計模式
- Java設計模式之(十一)——享元模式Java設計模式
- 設計模式系列13--享元模式設計模式
- C#設計模式之享元模式C#設計模式
- 通俗 Python 設計模式——享元模式Python設計模式
- 我學設計模式 之 享元模式設計模式
- Java學設計模式之享元模式Java設計模式
- Java設計模式(13):享元模式(蠅量模式)Java設計模式
- 設計模式【10】-- 順便看看享元模式設計模式
- 設計模式 | 享元模式及典型應用設計模式
- 11.java設計模式之享元模式Java設計模式
- 10、Python與設計模式–享元模式Python設計模式
- Java設計模式之七 —– 享元模式和代理模式Java設計模式
- 12.享元模式設計思想模式
- 每天一個設計模式之享元模式設計模式
- 軟體設計模式系列之十三——享元模式設計模式
- 設計模式--享元模式FlyWeight(結構型)設計模式
- C#設計模式系列:享元模式(Flyweight)C#設計模式
- 設計模式(十六)----結構型模式之代理享元模式設計模式
- 好程式設計師分享java設計模式之享元模式程式設計師Java設計模式
- 好程式設計師精講 java設計模式—享元模式程式設計師Java設計模式
- 無廢話設計模式(9)結構型模式--享元模式設計模式
- Rust語言之GoF設計模式:Flyweight享元模式RustGo設計模式
- 設計模式之:享元模式FlyweightPattern的實現設計模式
- 享元模式模式
- Java進階篇設計模式之七 —– 享元模式和代理模式Java設計模式
- Java進階篇設計模式之七 ----- 享元模式和代理模式Java設計模式