单例模式-基本实现01

 1 - (void)viewDidLoad
 2 {
 3     [super viewDidLoad];
 4
 5     [self test];
 6 }
 7
 8 - (void)test
 9 {
10         XZMusicTool *tool = [[XZMusicTool alloc] init];
11         XZMusicTool *tool2 = [[XZMusicTool alloc] init];
12         XZMusicTool *tool3 = [XZMusicTool sharedMusicTool];
13         XZMusicTool *tool4 = [XZMusicTool sharedMusicTool];
14
15         // copy 有可能会产生新的对象
16         // copy方法内部会调用- copyWithZone:
17         XZMusicTool *tool5 = [tool4 copy];
18
19         NSLog(@"%@ %@ %@ %@ %@", tool, tool2, tool3, tool4, tool5);
20 }        

[[XZMusicTool alloc] init];

[XZMusicTool sharedMusicTool];

[tool4 copy];

以上三种方式都能保证创建出来的对象是同一个.

 1 .
 2 //  懒汉式
 3
 4 #import "XZMusicTool.h"
 5
 6 @implementation XZMusicTool
 7 static id _instance;
 8
 9 /**
10  *  alloc方法内部会调用这个方法
11  */
12 + (id)allocWithZone:(struct _NSZone *)zone
13 {
14     if (_instance == nil) { // 防止频繁加锁
15         @synchronized(self) {
16             if (_instance == nil) { // 防止创建多次
17                 _instance = [super allocWithZone:zone];
18             }
19         }
20     }
21     return _instance;
22 }
23
24 + (instancetype)sharedMusicTool
25 {
26     if (_instance == nil) { // 防止频繁加锁
27         @synchronized(self) {
28             if (_instance == nil) { // 防止创建多次
29                 _instance = [[self alloc] init];
30             }
31         }
32     }
33     return _instance;
34 }
35
36 - (id)copyWithZone:(NSZone *)zone
37 {
38     return _instance;  // 既然可以copy,说明是已经创建了对象。
39 }
40 @end

列出下面代码做个比较:

 1 @implementation PayManager
 2
 3 +(instancetype)sharedManager {
 4     static dispatch_once_t onceToken;
 5     static PayManager *_instance;
 6     dispatch_once(&onceToken, ^{
 7         _instance = [[PayManager alloc] init];
 8     });
 9     return _instance;
10 }
11
12 @end
时间: 2024-11-07 04:29:31

单例模式-基本实现01的相关文章

二、单例模式之单例模式

单例模式创建方式有以下几种方式: 饿汉模式 懒汉模式 注册式模式 枚举式模式 序列化模式 1.饿汉模式 在类加载时初始化,也是利用类加载线程安全的特性确保了单例实例化的线程安全. package com.kancy.pattern.single; /** * 单例模式 - 饿汉模式 * @author kancy */ public class HungerSingleton { /** * 在类加载时初始化好单例对象,利用类加载来保证单例初始化的线程安全 * 优点:不用任何锁就能保证绝对线程安

看到“java单例模式”脑壳疼,学会这几招分分钟搞定

单例模式 单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为. 比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息.这种方式简化了在复杂环境下的配置管理. 单例模式的运用场景 外部资源:每台计算机有若干个打印机,但只能有一个PrinterSpo

我喜欢减肥我们来减肥吧

http://www.ebay.com/cln/honus.jyw4mvptb/cars/158313278016/2015.01.28.html http://www.ebay.com/cln/honus.jyw4mvptb/cars/158313282016/2015.01.28.html http://www.ebay.com/cln/honus.jyw4mvptb/cars/158313289016/2015.01.28.html http://www.ebay.com/cln/usli

百度回家看沙发沙发是减肥了卡斯加积分卡拉是减肥

http://www.ebay.com/cln/hpryu-caw8ke/cars/158056866019/2015.01.31 http://www.ebay.com/cln/xub.50x2l7cj/cars/158445650015/2015.01.31 http://www.ebay.com/cln/xub.50x2l7cj/cars/158445674015/2015.01.31 http://www.ebay.com/cln/xub.50x2l7cj/cars/1584456790

巢哑偕倥乇椭煞谙暗逞帕俸

IEEE Spectrum 杂志发布了一年一度的编程语言排行榜,这也是他们发布的第四届编程语言 Top 榜. 据介绍,IEEE Spectrum 的排序是来自 10 个重要线上数据源的综合,例如 Stack Overflow.Twitter.Reddit.IEEE Xplore.GitHub.CareerBuilder 等,对 48 种语言进行排行. 与其他排行榜不同的是,IEEE Spectrum 可以让读者自己选择参数组合时的权重,得到不同的排序结果.考虑到典型的 Spectrum 读者需求

我国第三代移动通信研究开发进展-尤肖虎200106

众所周知,数据科学是这几年才火起来的概念,而应运而生的数据科学家(data scientist)明显缺乏清晰的录取标准和工作内容.此次课程以<星际争霸II>回放文件分析为例,集中在IBM Cloud相关数据分析服务的应用.面对星际游戏爱好者希望提升技能的要求,我们使用IBM Data Science Experience中的jJupyter Notebooks来实现数据的可视化以及对数据进行深度分析,并最终存储到IBM Cloudant中.这是个介绍+动手实践的教程,参会者不仅将和讲师一起在线

pl/sql学习1——标量变量psahnh6S

为类型.不能用于表列的数据类型.范围为的子类型.自然数.为的子类型.具有约束为单精度浮点数.为变量赋值时.后面要加为双精度浮点数.为变量赋值时.后面要加.为数字总位数.为小数位数是的子类型.最大精度位是的子类型.最大精度位单精度浮点型是的子类型.最大精度位双精度浮点型定义精度为位的实数..定义为位的整数.变长字符串.最长测试变量数据!.定长字符串.最长测试变长二进制字符串物理存储的为类型...固定长度.个字节使用定义数据类型那个最小值:最大值:最小值:最大值:最小值:最大值:最小值:最大值:最小

iOS.常用设计模式.01.单例模式

使用单例模式的类: UIApplication UIAccelerometer NSUserDefaults NSNotificationCenter NSFileManager NSBundle等 Singleton.h #import <Foundation/Foundation.h> @interface Singleton : NSObject // 始终返回同一个Singleton的指针 + (Singleton *)sharedManager; @property (strong,

设计模式学习01—单例模式

一.动机与定义 系统中有些资源只能有一个,或者一个就够,多个浪费.例如一个系统只能有一个窗口管理器或文件系统.一个系统只能有一个计时器或序号生成器.web系统只能有一个页面计数器等等.此时,最好就需要把这些资源设置成有且仅有一个实例. 代码中也就是如何保证一个类只有一个实例并且这个实例能够被访问呢?只有一个实例的就意味着不能让其他类来实例化,也就是只能自己实例化自己.能够被访问也就意味着自身要对外提供全局方法来获取到这个实例,这就是单例模式. 单例模式定义:确保某一个类只有一个实例,而且自行实例