你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 詳解iOS App設計形式開辟中關於享元形式的應用

詳解iOS App設計形式開辟中關於享元形式的應用

編輯:IOS開發綜合

享元形式的概念

在面向對象軟件設計中,應用公共對象不只能節儉資本還能進步機能。同享的對象只能供給某些內涵的信息,而不克不及用來辨認對象。專門用於設計可同享對象的一種設計形式叫做享元形式(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)運用法式不依附於對象標示,由於同享對象不克不及供給獨一的標示。

【詳解iOS App設計形式開辟中關於享元形式的應用】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved