亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

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

2020-07-26 03:23:35
字體:
來源:轉載
供稿:網友

享元模式的概念

在面向對象軟件設計中,利用公共對象不僅能節省資源還能提高性能。共享的對象只能提供某些內在的信息,而不能用來識別對象。專門用于設計可共享對象的一種設計模式叫做享元模式(Flyweight pattern)。

實現享元模式需要兩個關鍵組件,通常是可共享的享元對象和保存他們的池。某種中央對象維護這個池,并從它返回適當的實例。
運用共享技術有效地支持大量細粒度的對象。

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

在面向對象軟件設計中,我們利用公共對象不僅能節省資源還能提高性能。比方說,某個人物需要一個類的一百萬個實例,但我們可以把這個類的一個實例讓大家共享,而把某些獨特的信息放在外部,節省的資源可能相當可觀(一個實例與一百萬個實例的差別)。共享的對象只提供某些內在的信息,而不能用來識別對象。專門用于設計可共享對象的一種設計模式叫做享元模式。

使得享元對象是輕量級的最重要原因是什么呢?不是它們的大小,而是通過共享能夠節省的空間總量。某些對象的獨特狀態可以拿到外部,在別處管理,其余部分被共享。比如說,原來需要一個類的一百萬個對象,但因為這個類的對象為享元,現在只要一個就夠了。這就是由于可共享的享元對象讓整個系統變得輕量的原因。通過仔細的設計,內存的節省非??捎^。在iOS開發中,節省內存意味著提升整體性能。


享元模式的實例應用

    我們創建一個WebSiteFactory工廠類,來維護池中的享元對象,根據父類型返回各種類型的具體享元對象,代碼如下:

復制代碼 代碼如下:

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

復制代碼 代碼如下:

#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方法可以返回具體的享元對象,返回的這個享元對象同時遵守WebSiteProtocol的協議,WebSiteProtocol的代碼如下:
復制代碼 代碼如下:

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

    ConcreteWebSite的代碼如下:
復制代碼 代碼如下:

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

復制代碼 代碼如下:

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

    User的代碼如下:
復制代碼 代碼如下:

#import <Foundation/Foundation.h>
 
@interface 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<WebSiteProtocol> WebsiteType;
@interface ViewController ()
 
@end

復制代碼 代碼如下:

@implementation ViewController
 
- (void)viewDidLoad {
    [super viewDidLoad];
    // 通過工廠方法返回各種具體享元對象,維護池中的享元對象
    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(@"個數: %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] 網站分類:首頁 用戶名字:張三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)應用程序不依賴于對象標示,因為共享對象不能提供唯一的標示。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美黑人一级爽快片淫片高清| 精品久久久久久中文字幕| 国产成人精品一区| 国产精品1234| 日韩人体视频一二区| 91成人福利在线| 欧美极品在线播放| 欧美小视频在线| 国产一区二区精品丝袜| 色偷偷亚洲男人天堂| 欧美视频国产精品| 亚洲人成人99网站| 亚洲性线免费观看视频成熟| 国产精品自拍网| 69影院欧美专区视频| 国产精品va在线播放我和闺蜜| 亚洲桃花岛网站| 欧美日韩另类字幕中文| 国产v综合ⅴ日韩v欧美大片| 欧美一级片久久久久久久| 国产这里只有精品| xxav国产精品美女主播| 精品性高朝久久久久久久| 日本精品中文字幕| 欧美成人免费全部| 亚洲一二在线观看| 97国产在线观看| 91精品免费久久久久久久久| 日韩av在线不卡| 北条麻妃一区二区在线观看| 美日韩丰满少妇在线观看| 欧美精品videossex性护士| 国产精品人成电影| 国产亚洲一区二区精品| 日韩av在线免费看| 日韩极品精品视频免费观看| 亚洲一区二区三区乱码aⅴ| 欧美国产第二页| 91九色视频导航| 亚洲免费av网址| 在线不卡国产精品| 欧美男插女视频| 精品视频在线导航| 97久久精品国产| 日韩在线激情视频| 国产在线a不卡| 午夜精品三级视频福利| 欧美乱妇40p| 精品视频在线播放| 日韩精品在线观看一区二区| www.美女亚洲精品| 亚洲精品久久在线| 中日韩美女免费视频网站在线观看| 欧美国产日韩视频| 国产午夜精品一区二区三区| 国产日本欧美一区二区三区在线| 日韩高清电影免费观看完整版| 亚洲精选在线观看| 国产69精品99久久久久久宅男| 午夜精品视频网站| 日韩国产激情在线| 精品国内自产拍在线观看| 91网在线免费观看| 亚洲在线第一页| 精品亚洲一区二区三区在线观看| 国产欧美日韩中文| 国产成人精品视频在线观看| 亚洲精品日韩丝袜精品| 91国产中文字幕| 亚洲欧美中文日韩在线| 国产精品免费一区二区三区都可以| 久久艹在线视频| 爱福利视频一区| 8090理伦午夜在线电影| 在线国产精品播放| 97视频在线观看播放| 日韩成人在线电影网| 欧美性猛交99久久久久99按摩| 久久人人爽人人爽人人片av高请| 久久久久久高潮国产精品视| 91高清免费在线观看| 国产精品看片资源| 在线观看国产精品日韩av| 久久露脸国产精品| 国产精品九九九| 欧美中文字幕视频在线观看| 成人中文字幕+乱码+中文字幕| 亚洲国产精品成人av| 久久国产色av| 91av在线播放视频| 日韩精品福利在线| 懂色av影视一区二区三区| 亚洲色图综合久久| 久久av中文字幕| 91国偷自产一区二区三区的观看方式| 岛国av一区二区三区| 欧美日韩另类在线| 国产亚洲欧美日韩美女| 97超碰蝌蚪网人人做人人爽| 国产成人精品免费视频| 国产丝袜精品第一页| 91九色国产在线| 久久夜精品va视频免费观看| 欧美在线欧美在线| 成人精品视频久久久久| 日韩在线视频中文字幕| 亚洲第一av在线| 欧美性猛交xxxx乱大交极品| 海角国产乱辈乱精品视频| 欧美午夜激情在线| 国产91在线高潮白浆在线观看| 国产日产久久高清欧美一区| 欧美极品少妇与黑人| 中文.日本.精品| 精品国产欧美一区二区三区成人| 久久综合伊人77777| 一二美女精品欧洲| 中文字幕在线成人| 国产成人+综合亚洲+天堂| 亚洲国产私拍精品国模在线观看| 色777狠狠综合秋免鲁丝| 午夜精品视频网站| 亚洲天堂男人天堂| 久久九九免费视频| 日韩中文字幕网站| 97视频在线观看免费高清完整版在线观看| 最新亚洲国产精品| 国产一区欧美二区三区| 亚洲精品久久久久中文字幕欢迎你| 国产精品国产自产拍高清av水多| 性视频1819p久久| 久久精品成人动漫| 欧美精品在线免费观看| 成人h视频在线| 国产999在线| 亚洲男女自偷自拍图片另类| 久久不射热爱视频精品| 日韩中文字幕久久| 亚洲视频综合网| 日韩欧美国产高清91| 中文字幕久热精品视频在线| 亚洲电影免费观看高清完整版在线观看| 亚洲成年网站在线观看| 久久久久成人精品| 欧美性猛交xxxx免费看久久久| 国产在线999| 国产成人精品免费视频| 亚洲精品成人久久| 国精产品一区一区三区有限在线| 91久久精品国产| 成人精品网站在线观看| 国产成人精品在线| 亚洲电影在线观看| 国产视频一区在线| 精品中文字幕久久久久久| 亚洲国产精品久久久久秋霞不卡| 精品欧美国产一区二区三区| 欧美丝袜一区二区三区| 欧美日韩一区二区在线| 91久久精品国产91性色| 欧美孕妇与黑人孕交| 欧美视频在线观看 亚洲欧| 日韩在线精品视频| 亚洲人成啪啪网站|