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设计模式学习之单例模式
一.单例模式介绍 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问, ...
随机推荐
- django signal
@receiver(post_save, sender=User) def create_account(sender, instance=None, **kwargs): if instance i ...
- JAVA-JSP内置对象之application对象获得其他信息
相关资料:<21天学通Java Web开发> application对象获得其他信息1.通过调用application对象的其他方法可以获得更多信息,如文件的MIME类型.获得指定Loca ...
- python 获取有关访问者的浏览器的 细节
检测访问者的浏览器和版本号有关访问者的浏览器的更多信息有关访问者的浏览器的全部细节根据浏览器来提醒用户 <html><body><script type="te ...
- [转]mysql中的字符串的拼接
字符串的拼接 1,Mysql 在Java.C#等编程语言中字符串的拼接可以通过加号“+”来实现,比如:"1"+"3"."a"+"b ...
- 【WPF】帐号系统中,用户注册的校验逻辑(正则表达式)
帐号系统中,用户注册时,在向服务器发送校验请求之前,客户端会先进行用户填写内容的校验(主要靠正则表达式). 由于校验注册的逻辑在多个项目中可以重用,这类通用的代码最好记录下来. 界面内容大致如下.现在 ...
- ListView@常用属性记录
android:stackFromBottom="true" | "false" 默认false 说明:当listview加载完毕,显示最下面的内容,或者显示最 ...
- win10无法访问局域网共享文件?解决如此简单。。。。。
1 笔记本系统win10 X64企业版,其中一文件夹已设置为“共享”.本地帐号登录系统. 2 平板电脑系统win8.1 X64专业版,可以顺畅的访问笔记本的共享文件.微软帐号登录系统. 3 平板电脑系 ...
- .net 定时启动任务
.net winform程序,设置每天的零时启动,执行完后自动关闭. 系统计划启动: 如果要定时启动某个程序,可以通过“任务计划”来安排. 如果是XP系统,在开始 --> 所有程序 --> ...
- android开发(36) Android WebView背景设置为透明
xml布局 <WebView android:id="@+id/wv_content" android:layout_width="match_parent&quo ...
- .NET中常见加解密算法
一.MD5不可逆加密 不可逆加密是指将原文加密成密文以后,无法将密文解密成原文. MD5的算法是公开的,无论是哪种语言,只要需要加密的字符串是相同的,那么经过MD5加密以后生成的结果都是一样的. .N ...