文档章节

两种创建单例的方法

浪子艾菲儿
 浪子艾菲儿
发布于 2013/05/02 16:31
字数 510
阅读 42
收藏 2

   1.

单例模式是在实际项目开发中用到比较多的一种设计模式,设计原理是整个系统只产生一个对象实例,通过一个统一的方法对外提供这个实例给外部使用。

在Java中,构造单例一般将类的构造函数声明为private类型,然后通过一个静态方法对外提供实例对象,那么,在OC中,如何实现单例的,请看下面完整代码。


@implementation Car

//声明一个静态对象引用并赋为nil

static Car *sharedInstance= nil;


//声明类方法(+为类方法,也就是Java中的静态方法)

+(Car *) sharedInstance

{

     if(!sharedInstance)

     {

          sharedInstance = [[self alloc] init];

     }

     return sharedInstance;

}

@end


//覆盖allocWithZone:方法可以防止任何类创建第二个实例。使用synchronized()可以防止多个线程同时执行该段代码(线程锁)


+(id)allocWithZone:(NSZone *) zone

{

     @synchronized(self)

     {

          if(sharedInstance == nil)

          {

               sharedInstance = [super allocWithZone:zone];

               return sharedInstance;

          }

     }

     return sharedInstance;

}


好了,到这里,OC中的单例就创建完成了,使用的话,直接类名调用类方法即可

   2.在开发中我们会用到NSNotificationCenter、NSFileManager等,获取他们的实例通过[NSNotificationCenter defaultCenter]和[NSFileManager defaultManager]来获取,其实这就是单例。

我们先看下函数void dispatch_once( dispatch_once_t *predicate, dispatch_block_t block);其中第一个参数predicate,该参数是检查后面第二个参数所代表的代码块是否被调用的谓词,第二个参数则是在整个应用程序中只会被调用一次的代码块。dispach_once函数中的代码块只会被执行一次,而且还是线程安全的。

       接下来我们来实现自己的单例,这里有一个SchoolManager类,为这个类实现单例

[cpp]   view plain copy
  1. +(SchoolManager *)sharedInstance  
  2. {  
  3.     static SchoolManager *sharedManager;  
  4.       
  5.     static dispatch_once_t onceToken;  
  6.     dispatch_once(&onceToken, ^{  
  7.         sharedManager = [[SchoolManager alloc] init];  
  8.     });  
  9.       
  10.     return sharedManager;  
  11. }  
到目前为止,我们就实现了一个单例,一切就搞定了,是不是很简单!

使用就按照如下方式获取唯一实例即可:

[cpp]   view plain copy
  1. SchoolManager *schoolManager = [SchoolManager sharedInstance];  

© 著作权归作者所有

浪子艾菲儿
粉丝 45
博文 49
码字总数 13001
作品 0
海淀
程序员
私信 提问
《Java-单例模式》

单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或...

吕檀溪
2016/07/28
66
0
Okhttp3网络请求框架简析思考——Android网络请求框架(五)

站在世界的巅峰看世界的心情,决不是一个普通人能够体会的到的感觉 1、对单例设计模式的思考 创建方式一 、 创建方式 二 创建方式三: 分析 简述: 1-1、可以看到上面三种创建单例的方法,第...

赵子龙
2016/09/13
845
0
js设计模式之单例模式

1、单例模式的概念 单例就是保证一个类只有一个实例,实例的方法一般是先判断存在与否,如果 存在直接返回,如果不存在就创建了再返回,这就确保了一个类只有一个实例对象。在JavaScript里,...

宁静致远1
2016/07/04
90
0
设计模式(一) ---- 单例模式

概念:一套被反复使用的,多数人知晓的,经过分类,编目的代码设计经验的总结 优点: 都是优秀的使用案例 可提高代码的重用性 使得代码易于理解 保证代码的可靠性 单例模式 引入: 现实生活中有些场...

文心丶雕龙
2016/06/30
21
0
Cocos2dx小技巧 单例

首先来说下什么是单例: 单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。 单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行...

暖冰
2015/11/29
49
0

没有更多内容

加载失败,请刷新页面

加载更多

Mybatis Plus删除

/** @author beth @data 2019-10-17 00:30 */ @RunWith(SpringRunner.class) @SpringBootTest public class DeleteTest { @Autowired private UserInfoMapper userInfoMapper; /** 根据id删除......

一个yuanbeth
今天
4
0
总结

一、设计模式 简单工厂:一个简单而且比较杂的工厂,可以创建任何对象给你 复杂工厂:先创建一种基础类型的工厂接口,然后各自集成实现这个接口,但是每个工厂都是这个基础类的扩展分类,spr...

BobwithB
今天
5
0
java内存模型

前言 Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模...

ls_cherish
今天
4
0
友元函数强制转换

友元函数强制转换 p522

天王盖地虎626
昨天
5
0
js中实现页面跳转(返回前一页、后一页)

本文转载于:专业的前端网站➸js中实现页面跳转(返回前一页、后一页) 一:JS 重载页面,本地刷新,返回上一页 复制代码代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a h...

前端老手
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部