寫一些簡單的東西好了,這邊簡單的介紹一個 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];
Delegate
張貼者:
Ehrippura
|
11/26/2011
Delegation 是物件導向 Design Pattern 的一種。
這種設計原則的作法,是讓 reciver 授權委託給 delegatee 物件來處理所接收到的訊息。如此一來,就可以模糊化 reciver 介面設計。這種設計方法大量被 Cocoa Framework 所使用,原因就在於將所屬職責委託出去,可以減少 reciver 負擔工作的種類,並且可以因為 delegatee 的設計的適應各種不同的狀況,增加程式設計上面的彈性。
在這裡舉一個例子:今天,SDK 裡面設計了表格物件。表格大概是我們最常見到用來分類、統整項目的方法。可是,根據需求不同,表格顯示資料的過濾方式、算法、資料的取得都會有所不同。設計表格物件的設計師不可能有辦法先把所有的狀況建立在表格物件裡面。所以設計便成為,當表格需要顯示資料的時候,它會向表格所授權的 delegatee 要求、取得資料之後,再自行顯示。
下面用一個比較簡單的實作例子,我們要求一個區塊物件,去繪製一個圖型:
我們可以看到,Frame 物件具有一個方法:draw。這個方法可以在框架所決定的區塊裡面繪製東西,可是我們並不知道到底要會製成什麼東西,所以我們就建立兩個物件:
Shape <----- Circle
Shape <----- Square
我們這裡,Shape 可以當做是一個母物件,並且遵守 FrameDelegate 協定,必須要有 draw 方法。如此一來,框架的實作本身就可以很簡單的:
在實際應用上面,就成了以下這個樣子:
Delegate 是 Cocoa Framework 裡面常用的技法,這得要記得喔!
這種設計原則的作法,是讓 reciver 授權委託給 delegatee 物件來處理所接收到的訊息。如此一來,就可以模糊化 reciver 介面設計。這種設計方法大量被 Cocoa Framework 所使用,原因就在於將所屬職責委託出去,可以減少 reciver 負擔工作的種類,並且可以因為 delegatee 的設計的適應各種不同的狀況,增加程式設計上面的彈性。
在這裡舉一個例子:今天,SDK 裡面設計了表格物件。表格大概是我們最常見到用來分類、統整項目的方法。可是,根據需求不同,表格顯示資料的過濾方式、算法、資料的取得都會有所不同。設計表格物件的設計師不可能有辦法先把所有的狀況建立在表格物件裡面。所以設計便成為,當表格需要顯示資料的時候,它會向表格所授權的 delegatee 要求、取得資料之後,再自行顯示。
下面用一個比較簡單的實作例子,我們要求一個區塊物件,去繪製一個圖型:
@protocol FrameDelegate
@required
@required
- (void)draw;
@end
@interface Frame : NSObject {
uint32 bound_x; // 相對整個畫面的座標
uint32 bound_y;
uint32 width; // 框架的長、寬
uint32 height;
id delegate;
}
- (void)draw;
- (void)setDelegate:(id <FrameDelegate>)obj;
@end
我們可以看到,Frame 物件具有一個方法:draw。這個方法可以在框架所決定的區塊裡面繪製東西,可是我們並不知道到底要會製成什麼東西,所以我們就建立兩個物件:
Shape <----- Circle
Shape <----- Square
我們這裡,Shape 可以當做是一個母物件,並且遵守 FrameDelegate 協定,必須要有 draw 方法。如此一來,框架的實作本身就可以很簡單的:
@implementation
... (do something)
- (void)draw {
// some work here
[delegate draw];
}
... (do something)
@end在實際應用上面,就成了以下這個樣子:
Frame *f1;
Frame *f2;
Circle *c;
Square *s;
[f1 setDelegate:c];
[f2 setDelegate:s];
[f1 draw]; // 畫出圓形
[f2 draw]; // 畫出方形Delegate 是 Cocoa Framework 裡面常用的技法,這得要記得喔!
訂閱:
文章 (Atom)