Objective-C设计模式——单例Singleton(对象创建)
单例
和其它语言的单例产不多,可以说是最简单的一种设计模式了。但是有几个点需要注意下,单例就是一个类只有一个实例。
所以我们要想办法阻止该类产生别的实例,一般语言中都会将构造函数写为private。但是OC中的函数并没有限定符,所以我们需要用一些小技巧来屏蔽这一点。
应用场景
类只能有一个实例,而且必须从一个为人熟知的访问点对其进行访问,比如工厂方法。
这个唯一的实例只能通过类的子类化进行扩展,而且扩展的对象不会破坏客户端代码。
注意
1.OC中单例的实例变量要定义在.m文件
2.OC中单例需要重载allocWithZone:和copyWithZone:方法来防止创建别的实例。
3.单例创建要注意线程安全,不然就可能出现多个实例。
注意问题将会在Demo中讲解
Demo
首先先来看一个最常规,的不严谨的单例实现:
@implementation Singletonstatic Singleton *sharedInstance;-(Singleton *)sharedInstance {if(sharedInstance){sharedInstance = [Singleton new];}return sharedInstance; }@end
这看似好像是可以得到单例对象了,但是这可以说是单例的一种变形。绝不能说这就是单例,因为我们可以轻松地通过其他方式来创建对象。
所以我们还要我修改allocWithZone:和copyWithZone:方法(alloc 和 copy 方法实际上就是调用这两个方法)
-(id)copyWithZone:(NSZone *)zone {return [[self class] sharedInstance]; }+(id)allocWithZone:(struct _NSZone *)zone {return [self sharedInstance]; }
可是这就出现另一个问题,在sharedInstance方法里面我们实际调用过allocWithZone:(new 调用 alloc),但是它的alloc被我们重写了,这就会出现错误。所以我们需要修改sharedInstance方法
+(Singleton *)sharedInstance {if(sharedInstance){sharedInstance = [[super allocWithZone:NULL] init];}return sharedInstance; }
这样就可以顺利的返回单例了,而且无法通过其它方式产生实例对象。
看似完美了实际还会有问题出现,因为现在是非线程安全的,可能存在同一时间创建多个实例的情况,所以修改如下
+(instancetype)sharedInstance {static dispatch_once_t once;dispatch_once(&once, ^{sharedInstance = [[super allocWithZone:NULL] init];});return sharedInstance; }
客户端代码如下:
Singleton *singleton = [Singleton sharedInstance];Singleton *singleton2 = [[Singleton alloc] init];Singleton *singleton3 = [singleton copy];[singleton print];[singleton2 print];[singleton3 print];
输出结果:
2015-07-21 21:10:32.797 Singleton[42537:10347987] 0x7fff5fbff7a8 2015-07-21 21:10:32.798 Singleton[42537:10347987] 0x7fff5fbff7a8 2015-07-21 21:10:32.798 Singleton[42537:10347987] 0x7fff5fbff7a8
可以看到内存都指向了同一地址。
转载于:https://www.cnblogs.com/pb89/p/4708785.html
Objective-C设计模式——单例Singleton(对象创建)相关推荐
- 设计模式--单例(Singleton)模式
模式意图 保证一个类只用一个实例,并且提供一个全局访问点 类图 应用场景 1.需要更严格地控制全局变量时,使用单例模式: 2.重量级的对象如线程池对象,数据库连接池对象,不需要多个实例的对象如工具类等 ...
- 设计模式学习笔记——单例(Singleton)模式
设计模式学习笔记--单例(Singleton)模式 @(设计模式)[设计模式, 单例模式, Singleton, 懒汉式, 饿汉式] 设计模式学习笔记单例Singleton模式 基本介绍 单例案例 类 ...
- Ruby设计模式透析之 —— 单例(Singleton)
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8868758 此为Java设计模式透析的拷贝版,专门为Ruby爱好者提供的,不熟悉R ...
- 23种设计模式 单例 (整理摘抄优秀的博文) 记住
https://github.com/yzmaodeng/java-keypointknowledge/commit/0894a14b03b724cd362f466e8f20514efbc164aa ...
- JAVA设计模式 - 单例与工厂模式
前言 设计模式是在前人总结下 , 得出的经验, 设计模式的本质是面向对象设计原则的实际运用,是对类的封装性.继承性和多态性以及类的关联关系和组合关系的充分理解, 接着我们来看设计模式中的两种比较重要的 ...
- 以下哪个选项不是单例模式的优点_设计模式--单例
概述 单例模式(SingletonPattern),保证一个类仅有一个实例,并提供一个访问它的全局访问点. 单例模式有 3 个特点: 单例类只有一个实例对象: 该单例对象必须由单例类自行创建: 单例类 ...
- 跨应用程序域(AppDomain)的单例(Singleton)实现
转载自: 跨应用程序域(AppDomain)的单例(Singleton)实现 - CorePlex代码库 - CorePlex官方网站,Visual Studio插件,代码大全,代码仓库,代码整理,分 ...
- Java设计模式—单例设计模式(Singleton Pattern)完全解析
转载请注明出处:http://blog.csdn.net/dmk877/article/details/50311791 相信大家都知道设计模式,听的最多的也应该是单例设计模式,这种模式也是在开发中用 ...
- java设计模式 单例_java设计模式一(单例模式singleton)
1 概述 如果要保证系统里一个类最多只能存在一个实例时,我们就需要单例模式.这种情况在我们应用中经常碰到,例如缓存池.数据库连接池.线程池.一些应用服务实例等.在多线程环境中为了保证实例的唯一性其实并 ...
最新文章
- [JS] 题解:提取不重复的整数
- LAMP一体环境快速安装
- [HNOI2008]遥远的行星
- Slog42_支配vue框架初阶项目之博客网站-单页-默认头像的布局和定位
- mysqldump 忽略视图_mysqldump的使用--解决不能导出视图的问题
- springmvc二十三:日期格式化
- oracle基表恢复,查找V$PARAMETER 基表 – 专业Oracle数据库恢复,或许是您恢复数据的最后机会@phone:13429648788 - 专业Oracle数据库恢复技术支持...
- 修改XMAPP中MYSQL的字符编码
- python布局管理数据_利用python创建窗口-布局管理器(五)
- Cisco 3550配置DHCP实例
- Android学习笔记之AndroidManifest.xml文件解析(摘自皮狼的博客)
- Autodesk BIM 360将基础设施建模也推向云端
- CICD详解(九)——gitlab简单使用
- 在边缘计算大热的背景下,为何Akamai敢说自己就是边缘
- 通过Powershell重新挂接父VHD磁盘的方法
- 算法:回溯十一 Subsets数组的子数组集合4种解法
- c语言dda算法完整实现,计算机图形学DDA算法.doc
- 利用opencv与python3 JPEG压缩与解压实现
- 移动开发技术的进化历程(原生开发与跨平台技术)
- printf 打印结构体成员函数出错原因分析