Single Pattern(单例模式)
单例模式是一种常用的软件设计模式。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的实例只能存在一个,单例模式是最好的解决方案。
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章 单例模式(Single Pattern)
原文 第1章 单例模式(Single Pattern) 单例模式就是保证在整个应用程序的生命周期中,在任何时刻,被指定的类只有一个实例,并为客户程序提供一个获取该实例的全局访问点. 一.常用模式: 1 ...
- 创建型模式篇(单例模式Single Pattern)
一.单例模式(Singleton Pattern) 单例模式要求一个类只能有一个实例,并且提供了一个全局的访问点. 比如说,中国主席的职位是Singleton,法律规定主席选举,任何时间只能有一个主席 ...
- Singleton Pattern单例模式
单例模式是一种对象创建模式,它用于产生一个对象的具体实例,它可以确保系统中一个类只产生一个实例.Java里面实现的单例是一个虚拟机的范围,因为装载类的功能是虚拟机的,所以一个虚拟机在通过自己的 Cla ...
- c# 单例模式(Single);单例模式的5种写法
单例模式(Singleton Pattern): 在平时的开发中,可能会用到单例模式,许多java的笔试题中也会叫笔试者写出单例模式的那几种写法并且分析.那么下面就来轻轻地探讨一下,最简单的设计模式, ...
- Python Singleton Pattern(单例模式)
简介 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. 当 ...
- Singleton Pattern(单例模式)
1.简介 单例模式,顾名思义,即在整个系统中,类的实例对象只有一个. 单例模式具有以下特点: 单例类只能有一个实例 单例类必须自己创建自己的唯一实例 单例类必须给所有其他对象提供这一实例 2.实现 其 ...
- Java中的单例模式(Singleton Pattern in Java)
Introduction 对于系统中的某个类来说,只有一个实例是很重要的,比如只有一个timer和ID Producer.又比如在服务器程序中,配置信息保留在一个文件中,这些配置信息由一个单例对象统一 ...
- Singleton Pattern -- 不一样的单例模式
Singleton Pattern -- 单例模式 单例模式是用来创建一个只能又一个实例的对象. 单例模式类图如下. 单例模式有两大好处: (1)对于频繁使用的对象,可以省略创建对象所话费的时间,这对 ...
- JavaScript设计模式学习之单例模式
一.单例模式介绍 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问, ...
随机推荐
- 1. 感知机原理(Perceptron)
1. 感知机原理(Perceptron) 2. 感知机(Perceptron)基本形式和对偶形式实现 3. 支持向量机(SVM)拉格朗日对偶性(KKT) 4. 支持向量机(SVM)原理 5. 支持向量 ...
- python 基础总计 2
6.函数: match.sqrt(),lower(),len(),type(),isinstance('a',str),max(),min(),dir(),hex(),setattar(ob ...
- php去除字符串中的HTML标签
php自带的函数可以去除/删除字符串中的HTML标签/代码. strip_tags(string,allow):函数剥去 HTML.XML 以及 PHP 的标签. 参数:string,必填,规定要检查 ...
- 【.Net】exe加密/加壳工具.Net Reactor
用WPF开发的桌面应用,编译后得到的项目启动项exe文件是未加密的,使用ILSpy等反编译工具能够直接看到该exe内的文件源码! 如下图: 可以使用.Net Reactor(有破/解版)等工具对exe ...
- OKR
不得不佩服老外对概念的提炼能力.一套一套的. Mission Vision Strategic Objectives Key Results Tasks
- Java byte类型转换成int类型时需要 & 0XFF的原因
Java byte类型转换成int类型时需要 & 0XFF的原因 假设有byte b = -1; 那么b的二进制是:1111 1111. 如果将b直接转换为int类型,那么二进制是 1111 ...
- bluetooth在linux应用开发
linux内Bluetooth的协议栈为BlueZ,http://www.bluez.org/.在4.46上,BlueZ实现了对A2DP Sink的支持,而之前的版本只支持A2DP Source.
- sql 拼接同列的值
sql中有时需要将列的值转成行的形式,比如下面的数据,具有相同Path的ZumenID有哪一些,该怎么做呢? 常见的做法可以参见这篇文章http://www.cnblogs.com/xiashengw ...
- jq 获取当前屏幕高度
alert($(window).height()); //浏览器时下窗口可视区域高度 alert($(document).height()); //浏览器时下窗口文档的高度 alert($(docum ...
- R语言进行数据预处理
R语言进行数据预处理wranging li_volleyball 2016年3月22日 data wrangling with Rpackages:tidyr dplyr Ground rules l ...