最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解iOS App設(shè)計(jì)模式開發(fā)中對于享元模式的運(yùn)用

 更新時(shí)間:2016年04月05日 09:33:16   作者:國土梅花  
這篇文章主要介紹了iOS App設(shè)計(jì)模式開發(fā)中對于享元模式的運(yùn)用,示例代碼為傳統(tǒng)的Objective-C,需要的朋友可以參考下

享元模式的概念

在面向?qū)ο筌浖O(shè)計(jì)中,利用公共對象不僅能節(jié)省資源還能提高性能。共享的對象只能提供某些內(nèi)在的信息,而不能用來識別對象。專門用于設(shè)計(jì)可共享對象的一種設(shè)計(jì)模式叫做享元模式(Flyweight pattern)。

實(shí)現(xiàn)享元模式需要兩個(gè)關(guān)鍵組件,通常是可共享的享元對象和保存他們的池。某種中央對象維護(hù)這個(gè)池,并從它返回適當(dāng)?shù)膶?shí)例。
運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度的對象。

公共交通(如公共汽車)已有一百多年的歷史了。大量去往相同方向的乘客可以分擔(dān)保有和經(jīng)營車輛(如公共汽車)的費(fèi)用。公共汽車有多個(gè)站臺,乘客沿著路線在接近他們目的地的地方上下車。到達(dá)目的地的費(fèi)用僅與行程有關(guān)。跟保有車輛相比,乘坐公共汽車要便宜得多。這就是利用公共資源的好處。

在面向?qū)ο筌浖O(shè)計(jì)中,我們利用公共對象不僅能節(jié)省資源還能提高性能。比方說,某個(gè)人物需要一個(gè)類的一百萬個(gè)實(shí)例,但我們可以把這個(gè)類的一個(gè)實(shí)例讓大家共享,而把某些獨(dú)特的信息放在外部,節(jié)省的資源可能相當(dāng)可觀(一個(gè)實(shí)例與一百萬個(gè)實(shí)例的差別)。共享的對象只提供某些內(nèi)在的信息,而不能用來識別對象。專門用于設(shè)計(jì)可共享對象的一種設(shè)計(jì)模式叫做享元模式。

使得享元對象是輕量級的最重要原因是什么呢?不是它們的大小,而是通過共享能夠節(jié)省的空間總量。某些對象的獨(dú)特狀態(tài)可以拿到外部,在別處管理,其余部分被共享。比如說,原來需要一個(gè)類的一百萬個(gè)對象,但因?yàn)檫@個(gè)類的對象為享元,現(xiàn)在只要一個(gè)就夠了。這就是由于可共享的享元對象讓整個(gè)系統(tǒng)變得輕量的原因。通過仔細(xì)的設(shè)計(jì),內(nèi)存的節(jié)省非常可觀。在iOS開發(fā)中,節(jié)省內(nèi)存意味著提升整體性能。


享元模式的實(shí)例應(yīng)用

    我們創(chuàng)建一個(gè)WebSiteFactory工廠類,來維護(hù)池中的享元對象,根據(jù)父類型返回各種類型的具體享元對象,代碼如下:

復(fù)制代碼 代碼如下:

#import <Foundation/Foundation.h>
#import "WebSiteProtocol.h"
@interface WebSiteFactory : NSObject
 
@property (nonatomic, strong) NSDictionary *flyweights; //共享對象
 
- (id<WebSiteProtocol>)getWebSiteCategory:(NSString *)webKey;
- (NSInteger)getWebSiteCount;
 
@end

復(fù)制代碼 代碼如下:

#import "WebSiteFactory.h"
#import "ConcreteWebSite.h"
@implementation WebSiteFactory
 
- (instancetype)init {
    self = [super init];
    if (self) {
        _flyweights = [NSDictionary dictionary];
    }
    return self;
}
 
- (id<WebSiteProtocol>)getWebSiteCategory:(NSString *)webKey {   
    __block id<WebSiteProtocol> webset = nil;
    [self.flyweights enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        if (webKey == key) {
            webset = obj;
            *stop = YES;
        }
    }];
    
    if (webset == nil) {
        ConcreteWebSite *concreteWebset = [[ConcreteWebSite alloc] init];
        concreteWebset.webName = webKey;
        webset = concreteWebset;
        
        NSMutableDictionary *mutabledic = [NSMutableDictionary dictionaryWithDictionary:self.flyweights];
        [mutabledic setObject:webset forKey:webKey];
        self.flyweights = [NSDictionary dictionaryWithDictionary:mutabledic];
    }
    
    return webset;
}
 
- (NSInteger)getWebSiteCount {
    return self.flyweights.count;
}
 
@end

    代碼中的getWebSiteCategory方法可以返回具體的享元對象,返回的這個(gè)享元對象同時(shí)遵守WebSiteProtocol的協(xié)議,WebSiteProtocol的代碼如下:
復(fù)制代碼 代碼如下:

#import <Foundation/Foundation.h>
#import "User.h"
@protocol WebSiteProtocol <NSObject>
 
- (void)use:(User *)user;
 
@end

    ConcreteWebSite的代碼如下:
復(fù)制代碼 代碼如下:

#import <Foundation/Foundation.h>
#import "WebSiteProtocol.h"
@interface ConcreteWebSite : NSObject <WebSiteProtocol>
 
@property (nonatomic, copy) NSString *webName;
 
@end

復(fù)制代碼 代碼如下:

#import "ConcreteWebSite.h"
 
@implementation ConcreteWebSite
 
- (void)use:(User *)user {
    NSLog(@"網(wǎng)站分類:%@ 用戶名字:%@", self.webName, user.userName);
}
 
@end

    User的代碼如下:
復(fù)制代碼 代碼如下:

#import <Foundation/Foundation.h>
 
@interface User : NSObject
 
@property (nonatomic, copy) NSString *userName;
 
@end

復(fù)制代碼 代碼如下:

#import "User.h"
 
@implementation User
 
@end

    至此,享元模式的代碼已經(jīng)完成了,我們來看下在客戶端怎么使用享元模式,代碼如下:
復(fù)制代碼 代碼如下:

#import "ViewController.h"
#import "WebSiteProtocol.h"
#import "WebSiteFactory.h"
#import "ConcreteWebSite.h"
#import "User.h"
typedef id<WebSiteProtocol> WebsiteType;
@interface ViewController ()
 
@end

復(fù)制代碼 代碼如下:

@implementation ViewController
 
- (void)viewDidLoad {
    [super viewDidLoad];
    // 通過工廠方法返回各種具體享元對象,維護(hù)池中的享元對象
    WebSiteFactory *factory = [[WebSiteFactory alloc] init];
    
    // 返回具體的享元對象
    WebsiteType type1 = [factory getWebSiteCategory:@"首頁"];
    User *user1 = [[User alloc] init];
    user1.userName = @"張三";
    // 享元對象都具有use方法
    [type1 use:user1];
    
    WebsiteType type2 = [factory getWebSiteCategory:@"商店"];
    User *user2 = [[User alloc] init];
    user2.userName = @"李四";
    [type2 use:user2];
    
    WebsiteType type3 = [factory getWebSiteCategory:@"案例"];
    User *user3 = [[User alloc] init];
    user3.userName = @"王五";
    [type3 use:user3];
    
    NSInteger count = [factory getWebSiteCount];
    NSLog(@"個(gè)數(shù): %ld", (long)count);
    
}
 
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
 
@end

    輸出如下:

2015-09-12 15:59:55.322 FlyweightPattern[42020:1723017] 網(wǎng)站分類:首頁 用戶名字:張三
2015-09-12 15:59:55.322 FlyweightPattern[42020:1723017] 網(wǎng)站分類:商店 用戶名字:李四
2015-09-12 15:59:55.322 FlyweightPattern[42020:1723017] 網(wǎng)站分類:案例 用戶名字:王五
2015-09-12 15:59:55.323 FlyweightPattern[42020:1723017] 個(gè)數(shù): 3

    分享相同的資源以執(zhí)行任務(wù),可能比使用個(gè)人的資源完成同樣的事情更加高效。享元模式可以通過共享一部分必需的對象,來節(jié)省大量的內(nèi)存。
   
何時(shí)使用享元模式
(1)應(yīng)用程序使用很多對象;
(2)在內(nèi)存中保存對象會影響內(nèi)存性能;
(3)對象的多數(shù)特有狀態(tài)(外在狀態(tài))可以放到外部而輕量化;
(3)移除了外在狀態(tài)后,可以用較少的共享對象替代原來的那組對象;
(4)應(yīng)用程序不依賴于對象標(biāo)示,因?yàn)楣蚕韺ο蟛荒芴峁┪ㄒ坏臉?biāo)示。

相關(guān)文章

最新評論

潼南县| 仙桃市| 拉孜县| 桐柏县| 江北区| 密山市| 林州市| 鲁山县| 镇巴县| 伊通| 嘉峪关市| 海门市| 铜鼓县| 清水县| 钦州市| 徐州市| 历史| 凤翔县| 汾西县| 凯里市| 阳山县| 阜宁县| 教育| 博白县| 闵行区| 车险| 商城县| 定南县| 贵德县| 赣榆县| 那坡县| 德清县| 绵阳市| 丹巴县| 曲阳县| 理塘县| 军事| 德兴市| 曲靖市| 北辰区| 克东县|