单例设计模式确切的说就是一个类只有一个实例,有一个全局的接口来访问这个实例。当第一次载入的时候,它通常使用延时加载的方法创建单一实例。

提示:苹果大量的使用了这种方法。例子:[NSUserDefaults standerUserDefaults], [UIApplication sharedApplication], [UIScreen mainScreen], [NSFileManager defaultManager] 都返回一个单一对象。

你可能想知道你为什么要关心一个类有多个的实例。代码和内存都很便宜,不是吗?

在一些情况下,一个类只有一个实例是有意义的。例如,这里没有必要有多个登录实例,除非你一次想写入多个日志文件。或者,一个全局的配置类文件:它可以很容易的很安全的执行一个公共资源,这样的一个配置文件,要比同时修改多个配置类文件好很多。

如何使用单例模式

请看下面的图片

上面的图片显示的是一个登录类,它有一个属性(这个单一实例),有两个方法:sharedInstance 和 init。

首先一个客户端(client)发送 sharedInstance 信息,但是属性 instance 还没有初始化,所以你要先给这个类创建一个实例。

然后你调用 sharedInstance,instance 会马上返回初始化的值。这个逻辑最终只会返回一个实例。

你需要执行这个模式来创建单例类来管理所有的专辑数据。

你需要注意在项目里有一个叫 API 文件夹,给你的 APP 提供服务的所有类都需要放在这里。在这个文件夹里用 iOS\Cocoa Touch\Object-C class 创建一个新类。类的名字叫 LibraryAPI,子类选择 NSObject。

打开 LibraryAPI.h 文件用下面的代码替换里面的内容:

@interface LibraryAPI: NSObject
+ (LibraryAPI*)sharedInstance;
@end

现在打开 LibraryAPI.m 文件,在 @implentation 后面添加如下方法:

+ (LibraryAPI*)sharedInstance
{
// 1
static LibraryAPI *_sharedInstance = nil; // 2
static dispatch_once_t oncePredicate; // 3
dispatch_once(&nocePredicate, ^{
_sharedInstance = [[LibraryAPI alloc] init];
});
return _sharedInstance;
}

在这个短方法中做了这些事情:

  • 在这个类中,声明一个静态变量来保存这个实例,保证它是一个全局可用的变量。

  • 声明一个静态这是 dispatch_one_t,确保这些初始化代码只能被执行一次。

  • 使用 Grand Central Dispatch(GCD)执行一个 block 来初始化 LibraryAPI 实例。这是单例设计模式的关键所在:一个类只能被实例化一次。

接下来执行 sharedInstance,在 dispatch_once block 里的代码是不会被执行的(当它已经被执行过一次后),它会返回之前创建的 LibraryAPI 实例。

提示:想了解更多关于 GCD 和使用它,请点击这里的教程 Multithreading and Grand Central Dispatch,如何使用 Blocks 在这里。

你现在有一个单例对象来管理专辑了。下一步就是创建一个类用来保存你的专辑数据了。

用 iOS\Cocoa Touch\Object-C class 在 API 文件夹下创建一个新的类,名字叫 PersistencyManager,子类选择 NSObject。

打开 PersistencyManager.h,在顶部引入面文件:

#import "Album.h"

然后在 @interface 后面加入下面代码:

- (NSArray *)getAlbums;
- (void)addAlbums:(Album*)album atIndex:(int)index;
- (void)deleteAlbumAtIndex:(int)index;

上面的三个方法都需要跟专辑的数据相结合。

打开 PersistencyManager.m,在 @implementation 上面添加如下代码:

@interface PersistencyManager () {
NSMutableArray *albums;
}

上面的代码是给类添加了一个扩展,这是另一种给类添加私有方法和私有属性的方法,类外面的成员是看不到这些的。这里,你声明了一个 NSMutableArray 来保存专辑的数据。这是一个可变数组,你可以很容易的添加和删除专辑。

现在在 @implementation 下面添加实现代码:

- (id)init {
self = [super init];
if (self) {
albums = [NSMutableArray arrayWithArray:@[[[Album alloc] initWithTitle:@"Best of Bowie" artist:@"David Bowie" coverUrl:@"http://www.coversproject.com/static/thumbs/album/album_david%20bowie_best%20of%20bowie.png" year:@"1992"],
[[Album alloc] initWithTitle:@"It's My Life" artist:@"No Doubt" coverUrl:@"http://www.coversproject.com/static/thumbs/album/album_no%20doubt_its%20my%20life%20%20bathwater.png" year:@"2003"],
[[Album alloc] initWithTitle:@"Nothing Like The Sun" artist:@"Sting" coverUrl:@"http://www.coversproject.com/static/thumbs/album/album_sting_nothing%20like%20the%20sun.png" year:@"1999"],
[[Album alloc] initWithTitle:@"Staring at the Sun" artist:@"U2" coverUrl:@"http://www.coversproject.com/static/thumbs/album/album_u2_staring%20at%20the%20sun.png" year:@"2000"],
[[Album alloc] initWithTitle:@"American Pie" artist:@"Madonna" coverUrl:@"http://www.coversproject.com/static/thumbs/album/album_madonna_american%20pie.png" year:@"2000"]]];
}
return self;
}

在 init 里你在数组中加入了 5 张专辑。如果上面的专辑你不喜欢,你可以随意替换成你喜欢的。:]

现存在 PersistencyManager.m 添加下面三个方法:

- (NSArray*)getAlbums
{
return albums;
} - (void)addAlbum:(Album*)album atIndex:(int)index
{
if (albums.count >= index)
[albums insertObject:album atIndex:index];
else
[albums addObject:album];
} - (void)deleteAlbumAtIndex:(int)index
{
[albums removeObjectAtIndex:index];
}

这些方法是获取,添加,删除专辑。

Build 你的项目,确保所有的代码都能正确编译。

现在,你也许想知道为什么会有一个 PersistencyManager 类,因为它都不是单例类。不要着急,接下来第二步,外观设计模式(Facade design patten) 将会探讨 LibraryAPI 和 PersistencyManager 之间的关系。

设计模式之三:单例模式singleton的更多相关文章

  1. 设计模式之单例模式——Singleton

                        设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...

  2. 设计模式(4) -- 单例模式(Singleton)

    设计模式(4)  -- 单例模式(Singleton) 试想一个读取配置文件的需求,创建完读取类后通过New一个类的实例来读取配置文件的内容,在系统运行期间,系统中会存在很多个该类的实例对象,也就是说 ...

  3. 乐在其中设计模式(C#) - 单例模式(Singleton Pattern)

    原文:乐在其中设计模式(C#) - 单例模式(Singleton Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 单例模式(Singleton Pattern) 作者:weba ...

  4. 【设计模式】单例模式-Singleton

    [设计模式]单例模式-SingletonEnsure a class has only one instance, and provide a global point to access of it ...

  5. 设计模式之——单例模式(Singleton)的常见应用场景

    单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此 ...

  6. 设计模式之单例模式(Singleton Pattern)

    单例模式 单例模式(Singleton Pattern)在java中算是最常用的设计模式之一,主要用于控制控制类实例的数量,防止外部实例化或者修改.单例模式在某些场景下可以提高系统运行效率.实现中的主 ...

  7. 设计模式一: 单例模式(Singleton)

    简介 单例模式是属于创建型模式的一种(另外两种分别是结构型模式,行为型模式).是设计模式中最为简单的一种. 英文单词Singleton的数学含义是"有且仅有一个元素的集合". 从实 ...

  8. 设计模式之——单例模式(Singleton)的常见应用场景(转):

    单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此 ...

  9. java设计模式之 单例模式 Singleton

    static 的应用 单例模式 Singleton 单例:保证一个类在系统中最多只创建一个实例. 好处:由于过多创建对象实例,会产生过多的系统垃圾,需要GC频繁回收,由于GC会占用较大的系统资源,所有 ...

  10. 【设计模式】单例模式 Singleton Pattern

    通常我们在写程序的时候会碰到一个类只允许在整个系统中只存在一个实例(Instance)  的情况, 比如说我们想做一计数器,统计某些接口调用的次数,通常我们的数据库连接也是只期望有一个实例.Windo ...

随机推荐

  1. 关于input内容监听(change)

    js的话利用input的onchange事件 而jquery的话利用change()函数,代码如下: <!DOCTYPE html> <html> <head> & ...

  2. 【转】 #1451 - Cannot delete or update a parent row: a foreign key constraint fails 问题的解决办法

    转载地址:http://blog.csdn.net/donglynn/article/details/17056099 错误 SQL 查询: DELETE FROM `zmax_lang` WHERE ...

  3. 将B表的字段内容插入到A表字段中

    update hy_b_hacker as h , ( SELECT ( @rowNO := @rowNo +1 ) AS rowno, ip FROM ( SELECT * FROM hy_b_se ...

  4. 【Java】一个小程序,计算它包含的代码所需的耗时

    写一个小程序,用来计算它包含的代码所需的耗时.虽然简单,测试代码是否耗时还是有点用的,不用重新写嘛~ import java.util.Date; import java.util.concurren ...

  5. ArcGIS Javascript查询数据库并添加到地图上

    将数据存放到数据库中,动态的调取比较灵活,数据变动后不需要改变图层的属性表. 此处采用的方法是通过jquery查询数据库,并将数据库的结果生产json串返回给js,在js中动态解析json串增加点至地 ...

  6. [问题2014A02] 解答三(降阶公式法)

    [问题2014A02] 解答三(降阶公式法) 将矩阵 \(A\) 写成如下形式: \[A=\begin{pmatrix} -2a_1 & 0 & \cdots & 0 & ...

  7. 从零开始学iPhone开发(1)——工具的使用

    前提:已经具备了苹果电脑或者iMac,或者安装好了x86苹果而且已经联网. 苹果系统版本要求是:Max OS X Lion,或者 Mountain Lion 我们对iPhone进行使用的工具是XCod ...

  8. Oracle介绍(初学者必须知道的)

    1.为什么学习数据库?(两个概念) 数据库的概念: 数据库是按照数据结构组织,存储和管理数据的仓库. 数据库,简单来说是本身可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增. ...

  9. Linux sticky bit 目录权限 rwt权限

    [linux权限分为 user group others三组] 今天看到有个目录的权限是rwxrwxrwt 很惊讶这个t是什么,怎么不是x或者-呢?搜了下发现: 这个t代表是所谓的sticky bit ...

  10. Sqrt(x) - LintCode

    examination questions Implement int sqrt(int x). Compute and return the square root of x. Example sq ...