单例模式是一种常用的软件设计模式。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的实例只能存在一个,单例模式是最好的解决方案。

iPhone SDK 中使用此模式的有很多,例如:

[UIApplication sharedApplication] 返回一个指向代表应用程序的单例对象的指针。[UIDevice currentDevice] 获取一个代表所使用硬件平台的对象。

将类方法与单例相结合,便可以在程序的任何地方通过对象方法获取单个实例,而无需使用指向对象的指针或保存它的实例变量。这里举个例子:

main.m

 //
// main.m
// OCSinglePattern(单例模式)
//
// Created by Kenmu on 15/5/15.
// Copyright (c) 2015年 Kenmu. All rights reserved.
// #import <Foundation/Foundation.h>
#import "SinglePatternClass.h"
#import "SinglePatternClass2.h" int main(int argc, const char * argv[]) {
@autoreleasepool {
NSLog(@"普通方式实现单例模式");
SinglePatternClass *objA = [SinglePatternClass defaultSinglePatternClass];
objA.name = @"Kenmu的单例模式";
NSLog(@"objA.name=%@", objA.name); //objA.name=Kenmu的单例模式
SinglePatternClass *objB = [SinglePatternClass defaultSinglePatternClass];
NSLog(@"objB.name=%@", objB.name); //objB.name=Kenmu的单例模式
objB.name = @"Kenmu的单例模式,修改objB.name,看objA.name是否也跟随变化";
NSLog(@"单例模式测试%@", [objB.name isEqualToString:objA.name] ? @"成功" : @"失败"); //单例模式测试成功 NSLog(@"\n\nGCD实现单例模式");
SinglePatternClass2 *objC = [SinglePatternClass2 sharedSinglePatternClass2];
objC.name = @"Kenmu的单例模式";
NSLog(@"objC.name=%@", objC.name); //objC.name=Kenmu的单例模式
SinglePatternClass2 *objD = [SinglePatternClass2 sharedSinglePatternClass2];
NSLog(@"objD.name=%@", objD.name); //objD.name=Kenmu的单例模式
objB.name = @"Kenmu的单例模式,修改objD.name,看objC.name是否也跟随变化";
NSLog(@"单例模式测试%@", [objD.name isEqualToString:objC.name] ? @"成功" : @"失败"); //单例模式测试成功
}
return ;
}

SinglePatternClass.h

 #import <Foundation/Foundation.h>

 @interface SinglePatternClass : NSObject
@property (strong, nonatomic) NSString *name; /**
* 普通方式实现单例模式
*
* @return SinglePatternClass单例
*/
+ (SinglePatternClass *)defaultSinglePatternClass;
@end

SinglePatternClass.m

 #import "SinglePatternClass.h"

 static SinglePatternClass *singleObj = nil;
@implementation SinglePatternClass
+ (SinglePatternClass *)defaultSinglePatternClass {
@synchronized(self) { //这里用@synchronized实现锁,其实还可以用其他方式实现锁;例如:NSLock和C语言的pthread_mutex_t、GCD的dispatch_semaphore_t(信号量)
if (!singleObj) {
singleObj = [[SinglePatternClass alloc] init]; //这里alloc方法会调用allocWithZone:方法
}
return singleObj;
}
} + (id)allocWithZone:(struct _NSZone *)zone {
@synchronized(self) {
if (!singleObj) {
singleObj = [super allocWithZone:zone];
return singleObj;
}
}
return nil;
}
@end

SinglePatternClass2.h  

 #import <Foundation/Foundation.h>

 @interface SinglePatternClass2 : NSObject
@property (strong, nonatomic) NSString *name; /**
* GCD实现单例模式
*
* @return SinglePatternClass2单例
*/
+ (SinglePatternClass2 *)sharedSinglePatternClass2;
@end

SinglePatternClass2.m

 #import "SinglePatternClass2.h"

 @implementation SinglePatternClass2
+ (SinglePatternClass2 *)sharedSinglePatternClass2 {
static SinglePatternClass2 *singleObj2; static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{ //第一个参数&onceToken是用于检查代码块是否被调用过的谓词,第二个参数是具体执行内容的代码块。dispatch_once方法中的代码块只会被执行一次,而且还是线程安全的
singleObj2 = [[SinglePatternClass2 alloc] init];
});
return singleObj2;
}
@end
 
代码说明: 

1、synchronized 这个主要是考虑多线程的程序,这个指令可以将{ } 内的代码限制在一个线程执行,如果某个线程没有执行完,其他的线程如果需要执行就得等着。

2、allocWithZone 这个是重载的,因为这个是从制定的内存区域读取信息创建对象实例,所以如果需要的对象实例已经存在了,就需要禁止修改当前对象实例,所以返回 nil。

Single Pattern(单例模式)的更多相关文章

  1. 第1章 单例模式(Single Pattern)

    原文 第1章 单例模式(Single Pattern) 单例模式就是保证在整个应用程序的生命周期中,在任何时刻,被指定的类只有一个实例,并为客户程序提供一个获取该实例的全局访问点. 一.常用模式: 1 ...

  2. 创建型模式篇(单例模式Single Pattern)

    一.单例模式(Singleton Pattern) 单例模式要求一个类只能有一个实例,并且提供了一个全局的访问点. 比如说,中国主席的职位是Singleton,法律规定主席选举,任何时间只能有一个主席 ...

  3. Singleton Pattern单例模式

    单例模式是一种对象创建模式,它用于产生一个对象的具体实例,它可以确保系统中一个类只产生一个实例.Java里面实现的单例是一个虚拟机的范围,因为装载类的功能是虚拟机的,所以一个虚拟机在通过自己的 Cla ...

  4. c# 单例模式(Single);单例模式的5种写法

    单例模式(Singleton Pattern): 在平时的开发中,可能会用到单例模式,许多java的笔试题中也会叫笔试者写出单例模式的那几种写法并且分析.那么下面就来轻轻地探讨一下,最简单的设计模式, ...

  5. Python Singleton Pattern(单例模式)

    简介 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. 当 ...

  6. Singleton Pattern(单例模式)

    1.简介 单例模式,顾名思义,即在整个系统中,类的实例对象只有一个. 单例模式具有以下特点: 单例类只能有一个实例 单例类必须自己创建自己的唯一实例 单例类必须给所有其他对象提供这一实例 2.实现 其 ...

  7. Java中的单例模式(Singleton Pattern in Java)

    Introduction 对于系统中的某个类来说,只有一个实例是很重要的,比如只有一个timer和ID Producer.又比如在服务器程序中,配置信息保留在一个文件中,这些配置信息由一个单例对象统一 ...

  8. Singleton Pattern -- 不一样的单例模式

    Singleton Pattern -- 单例模式 单例模式是用来创建一个只能又一个实例的对象. 单例模式类图如下. 单例模式有两大好处: (1)对于频繁使用的对象,可以省略创建对象所话费的时间,这对 ...

  9. JavaScript设计模式学习之单例模式

    一.单例模式介绍                 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问, ...

随机推荐

  1. Faiss教程:GPU

    Fassi通过CUDA支持GPU,要求3.5以上算力,float16要求CUDA7.5+ 通过index_gpu_to_cpu可以将索引从GPU复制到CPU,index_cpu_to_gpu 和 in ...

  2. 线程的几种状态转换<转>

    线程在一定条件下,状态会发生变化.线程一共有以下几种状态: 1.新建状态(New):新创建了一个线程对象. 2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法. ...

  3. CPP_template

    泛型编程是独立于任何特定类型的方式编写代码.模板是泛型编程的基础,模板使程序员能够快速建立具有类型安全的类库集合和函数集合,它的实现,方便了大规模的软件开发. 模板提供通用类型和通用函数,定义中包含t ...

  4. Spark Shuffle原理解析

    Spark Shuffle原理解析 一:到底什么是Shuffle? Shuffle中文翻译为“洗牌”,需要Shuffle的关键性原因是某种具有共同特征的数据需要最终汇聚到一个计算节点上进行计算. 二: ...

  5. python 查找文件内容

    输入查找的文件夹路径,要查找的内容关键字(可以指定多个),要查找的文件类型(可以是多个),搜索出符合条件的文件,并记录所有符合条件的行号及行内容. 写的感觉有点冗余,但好歹还能使用^-^,主要是方便手 ...

  6. 【进阶修炼】——改善C#程序质量(4)

    46, 显示释放资源,需要实现IDisposable接口. 最好按照微软建议的Dispose模式实现.实现了IDisposable接口后,在Using代码块中,垃圾会得到自动清理. 47, 即使提供了 ...

  7. [转] JSON转换

    转载自:http://www.360doc.com/content/12/0413/14/9529755_203286509.shtml# JSON简介 JSON(JavaScript Object ...

  8. 编译安装Mysql与管理(十四)

    [教程主题]:编译安装Mysql与管理 [课程录制]: 创E [主要内容] [1]什么是Mysql MyQL是一个开放源码的小型关系型数据库管理系统,开发者为瑞典MySQL AB公司.目前MySQL被 ...

  9. Hive Tunning(三) 最佳实践

    在上一讲的基础上,我们来做来一个实际的例子来展示如何在实操中进行高效的hive查询作业. (1)首先我们建立一个表 CREATE EXTERNAL TABLE pos_staging( txnid S ...

  10. jQuery(七):节点操作

    jQuery中节点操作主要分为以下几种: 查找节点. 创建节点. 插入节点. 替换节点. 复制节点. 删除节点. 一.查找节点 示例: <!DOCTYPE html> <html l ...