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

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. iOS手机号,身份证,车牌号正则表达式

    1.手机号判断,根据维基百科2016年6月修订的段号判断 是否是手机号 /** 手机号码 13[0-9],14[5|7|9],15[0-3],15[5-9],17[0|1|3|5|6|8],18[0- ...

  2. 基于jQuery实现的腾讯互动娱乐网站特效

    分享一款基于jQuery实现的腾讯互动娱乐网站特效.腾讯互动娱乐网站jQuery特效是一款右侧带伸缩选项卡,支持鼠标滚轮滚动切换特效代码.效果图如下: 在线预览   源码下载 实现的代码. html代 ...

  3. TypeError: decoding Unicode is not supported

    在试图读取网页的时候遇到TypeError: decoding Unicode is not supported, 主要原因是返回的字符串已经是unicode类型了

  4. ubuntu 安装 mkfs.ubifs

    ubi 文件系统的制作需要 mkfs.ubifs 工具 但是又没有直接的 sudo apt-get install , 只能通过以下方式 sudo apt-get install mtd-utils

  5. Java并发编程:阻塞队列 <转>

    在前面几篇文章中,我们讨论了同步容器(Hashtable.Vector),也讨论了并发容器(ConcurrentHashMap.CopyOnWriteArrayList),这些工具都为我们编写多线程程 ...

  6. Android ——利用OnDraw实现自定义View(转)

    自定义View的实现方式大概可以分为三种,自绘控件.组合控件.以及继承控件.本文将介绍自绘控件的用法.自绘控件的意思是,这个控件上的内容是用onDraw函数绘制出来的.关于onDraw函数的介绍可参看 ...

  7. Sahi (3) —— 压力测试Load Test以CAS SSO登陆场景为例(103 Tutorial)

    Sahi (3) -- 压力测试Load Test以CAS SSO登陆场景为例(103 Tutorial) jvm版本: 1.8.0_65 sahi版本: Sahi Pro 6.1.0 参考来源: S ...

  8. drupal 不错的网址

    1.最重要的7个Drupal内核模板文件 http://mydrupal.org/%E6%9C%80%E9%87%8D%E8%A6%81%E7%9A%847%E4%B8%AAdrupal%E5%86% ...

  9. Linux Makefile简单模板

    ########################################### #Makefile for simple programs ########################## ...

  10. mysql执行带外键的sql文件时出现mysql ERROR 1215 (HY000): Cannot add foreign key constraint的解决

    ERROR 1215 (HY000): Cannot add foreign key constraint 最近在建表时遇到了这个错误,然后找了下找到了解决办法,记录下: 本来是要建两张表: 1 2 ...