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模式:
1. @implementation Singleton
2.
3. + (Singleton *)instance {
4. static Singleton *instance;
5.
6. @synchronized(self) {
7. if(!instance) {
8. instance = [[Singleton alloc] init];
9.
10.
11. }
12. }
13.
14. return instance;
15. }
16.
17. @end
这个单例可以用[Singleton instance]得到.
一次查阅下面的步骤:
第四行:
声明了静态变量,如果你有JAVA编程背景的话,这里或许会让你有点疑惑,在C(C++ 和 Objective-C)中,一个静态局部变量作用域存在于函数内,但是生命周期是整个程序,在下一次该函数调用时仍可使用。(和java中的类静态变量被该类各个实例变量共有的特点相似)。
译者注:关于静态变量有疑问的同学请猛击这里: http://baike.baidu.com/view/675642.htm
第六行:
我们想使用线程保护,这样同时的两个[Singleton instance]调用不会产生两个独立的对象实例。即使在一个单线程程序中,这种Synchronization不会有大的执行时间开销,而且这为以后开发打下了好的基础。
第七行:
检查是否该类对象实例已经初始化。我们是否需要生成该类的实例。
十四行:
返回创建的/已存在的对象实例。
当迁移到一种新的编程语言时,需要面临的问题之一就是怎样设计对应于该语言的设计模式。大部分情况语言为设计模式提供了易于实现的内建支持,或者干脆拥有直接实现了这种设计模式。
举例来说,在Python中,实现Command Dispatch模式和Singleton模式几乎时完全不必要的,你只需要在创建的模块(module)顶部插入"""This module implements the singleton pattern"""就万事大吉啦!实质上这就是一个Singleton。 省事吧:~)
但是换成Objective-c就不一样了:~(。下面我(指作者:David)就开始讲解如何在Objective-c中实现在我日常iphone开发中需要用到的设计模式。
在这些设计模式中,我发现自己最需要用到的是Singleton模式。在程序中,我需要一系列的对象,他们每一个内部都包含有一组变量和功能,是静态的,而且整个程序都只需要拥有一个该类的对象。
例如:
1.控制程序执行的命令器
2.管理数据库
3.音效控制
4.文件处理
还有很多很多…
简单来讲,我的众多游戏引擎之间需要去共享一系列的变量和功能,但是我并不想实例化多个对象。
在做了一些搜索后,我创建了下面的singleton模式:
1. @implementation Singleton
2.
3. + (Singleton *)instance {
4. static Singleton *instance;
5.
6. @synchronized(self) {
7. if(!instance) {
8. instance = [[Singleton alloc] init];
9.
10.
11. }
12. }
13.
14. return instance;
15. }
16.
17. @end
这个单例可以用[Singleton instance]得到.
一次查阅下面的步骤:
第四行:
声明了静态变量,如果你有JAVA编程背景的话,这里或许会让你有点疑惑,在C(C++ 和 Objective-C)中,一个静态局部变量作用域存在于函数内,但是生命周期是整个程序,在下一次该函数调用时仍可使用。(和java中的类静态变量被该类各个实例变量共有的特点相似)。
译者注:关于静态变量有疑问的同学请猛击这里: http://baike.baidu.com/view/675642.htm
第六行:
我们想使用线程保护,这样同时的两个[Singleton instance]调用不会产生两个独立的对象实例。即使在一个单线程程序中,这种Synchronization不会有大的执行时间开销,而且这为以后开发打下了好的基础。
第七行:
检查是否该类对象实例已经初始化。我们是否需要生成该类的实例。
十四行:
返回创建的/已存在的对象实例。