標籤

2012年4月8日 星期日

Shared Instance

| 12/03/2011
http://seruziu.blogspot.com/2011/12/shared-instance.html

寫一些簡單的東西好了,這邊簡單的介紹一個 Design Pattern:Singleton。
簡單一點的說法,就是「分享實體(Shared Instance)」。

這個 Design Pattern 是用來確保程式中某些物件實體只能有一個、或是數個,不應該被重複性的建立。打個比方來說,程式本身的實體、系統服務(資源)的實體,都是很好的例子。為了要達到這個目的,我們會為該物件建立單一的存取窗口:


@interface MyObj : NSObject
+ (id)sharedInstance;
@end


@implementation MyObj


+ (id)sharedInstance
{
    // 物件實體靜態存在
    static id master = nil;
    // 若實體尚未被建立,在此建立一個
    if (!master) {
         master = [MyObj new];
    }
    return master;
}


@end

如此一來,我們就只能使用 sharedInstance 來存取該實體,並且在該程式之中,任何的介面都會存取到相同的實體。

MyObj *obj1 = [MyObj sharedInstance];
MyObj *obj2 = [MyObj sharedInstance];


// obj1 == obj2

在 Cocoa 中最常用到的實例莫過於:

[NSApplication sharedApplication];
[NSBundle mainBundle];
[NSNotificationCenter defaultCenter];
[NSUserDefault standardUserDefault];



補足一點,iOS 4、Snow Leopard 之後,蘋果引進了 GCD。裡面有一個新的函式 dispatch_once,可以確保某個 Block 在應用程式存活時間內只被執行過一次。所以我們可以用:

+ (MyObj *)sharedInstance
{
static dispatch_once_t once;
static MyObj *master;
dispatch_once(&once, ^ { master = [[MyObj alloc] init]; });
return master;
}

沒有留言:

張貼留言