原文地址:http://numbergrinder.com/node/29
Objective-C 設計模式:Singleton Pattern
當遷移到一種新的編程語言時,需要面臨的問題之一就是怎樣設計 對應於該語言的設計模式。大部分情況語言為設計模式提供了易於實現的內建支持,或者干脆擁有直接實現了這種設計模式。
舉 例來說,在Python中,實現Command Dispatch模式和Singleton模式幾乎時完全不必要的,你只需要在創建的模塊(module)頂部插入"""This module implements the singleton pattern"""就萬事大吉啦!實質上這就是一個Singleton。 省事吧:~)
但是換成Objective-c就不一樣了:~(。下面我(指作者:David)就開始講解如何在Objective-c中實現在我日常iphone開發 中需要用到的設計模式。
在這些設計模式中,我發現自己最需要用到的是Singleton模式。在程序中,我需要一系列的對象,他們每一個內部都包含有一組變量和功能,是靜態的,而且整個程序都只需要擁有一個該類的對象。
例如:
1.控制程序執行的命令器
2.管理數據庫
3.音效控制
4.文件處理
還有很多很多…
簡單來講,我的眾多游戲 引擎之間需要去共享一系列的變量和功能,但是我並不想實例化多個對象。
在做了一些搜索后,我創建了下面的singleton模式:
@implementation Singleton
+ (Singleton *)instance {
static Singleton *instance;
@synchronized(self) {
if(!instance) {
instance = [[Singleton alloc] init];
}
}
return instance;
}
@end
這個單例 可以用[Singleton instance]得到.
一次查閱下面的步驟:
第四行:
聲明了靜態變量,如果你有JAVA編程背景的話,這里或許會讓你有點疑惑,在C(C++ 和 Objective-C)中,一個靜態局部變量作用域存在於函數內,但是生命周期是整個程序,在下一次該函數調用時仍可使用 。(和java中的類靜態變量被該類各個實例變量共有的特點相似)。
譯者注:關於靜態變量有疑問的同學請猛擊這里:http://baike.baidu.com/view/675642.htm
第六行:
我們想使用線程保護,這樣同時的兩個[Singleton instance]調用不會產生兩個獨立的對象實例。即使在一個單線程程序中,這種Synchronization不會有大的執行時間開銷,而且這為以后開發 打下了好的基礎。
第七行:
檢查是否該類對象實例已經初始化。我們是否需要生成該類的實例。
十四行:
返回創建的/已存在的對象實例。
