一、概念

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

通俗的说来:单例模式用于当一个类只能有一个实例的时候。

1.单例模式需要达到的目的:
• 封装一个共享的资源
• 提供一个固定的实例创建方法
• 提供一个标准的实例访问接口

2.单例模式的要点:

显然单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。

3.单例模式的优点:

1.实例控制:Singleton 会阻止其他对象实例化其自己的 Singleton 对象的副本,从而确保所有对象都访问唯一实例。

2.灵活性:因为类控制了实例化过程,所以类可以更加灵活修改实例化过程

IOS中的单例模式
在objective-c中要实现一个单例类,至少需要做以下四个步骤:
 
1、为单例对象实现一个静态实例,并初始化,然后设置成nil
①在.h文件中定义一个类方法,返回当前实例
  1. @interface SingleInstance : NSObject
  2. //定义一个类方法,返回当前对象的实例
  3. + (instancetype) sharedInstance;
  4. @end

②在.m文件中定义一个静态的当前单例对象的实例,并赋值为nil

static SingleInstance *instance = nil;

2、实现一个实例构造方法检查上面声明的静态实例是否为nil,如果是则新建并返回一个本类的实例

①第一种实现方法

  1. //防止多线程同时执行,而创建多个对象
  2. @synchronized(self)
  3. {
  4. //当前对象为空
  5. if (!instance)
  6. {
  7. instance = [[self alloc] init];
  8. }
  9.  
  10. return instance;
  11. }

②第二种实现方法(推荐使用)

  1. static dispatch_once_t onceToken;
  2. dispatch_once(&onceToken, ^{
  3. instance = [[self alloc] init];
  4. });
  5.  
  6. return instance;

3、重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实力的时候不产生一个新实例

  1. //alloc会触发,重新allocWithZone方法,防止通过alloc创建一个新的对象
  2. + (instancetype)allocWithZone:(struct _NSZone *)zone
  3. {
  4. if (!instance)
  5. {
  6. instance = [super allocWithZone:zone];
  7. }
  8.  
  9. return instance;
  10. }

4、适当实现allocWitheZone,copyWithZone,release和autorelease。

  1. + (id)copyWithZone:(struct _NSZone *)zone
  2. {
  3. return self;
  4. }
  5.  
  6. + (id)mutableCopyWithZone:(struct _NSZone *)zone
  7. {
  8. return self;
  9. }
  10.  
  11. - (instancetype)retain
  12. {
  13. return self;
  14. }
  15.  
  16. - (oneway void)release
  17. {
  18.  
  19. }
  20.  
  21. - (instancetype)autorelease
  22. {
  23. return self;
  24. }
  25.  
  26. - (NSUInteger)retainCount
  27. {
  28. return MAXFLOAT;
  29. }

设计模式 --- 单例模式(Singleton)的更多相关文章

  1. 设计模式 单例模式(Singleton) [ 转载2 ]

    设计模式 单例模式(Singleton) [ 转载2 ] @author java_my_life 单例模式的结构 单例模式的特点: 单例类只能有一个实例. 单例类必须自己创建自己的唯一实例. 单例类 ...

  2. 设计模式 单例模式(Singleton) [ 转载 ]

    设计模式 单例模式(Singleton) [ 转载 ] 转载请注明出处:http://cantellow.iteye.com/blog/838473 前言 懒汉:调用时才创建对象 饿汉:类初始化时就创 ...

  3. JAVA设计模式-单例模式(Singleton)线程安全与效率

    一,前言 单例模式详细大家都已经非常熟悉了,在文章单例模式的八种写法比较中,对单例模式的概念以及使用场景都做了很不错的说明.请在阅读本文之前,阅读一下这篇文章,因为本文就是按照这篇文章中的八种单例模式 ...

  4. 浅谈设计模式--单例模式(Singleton Pattern)

    题外话:好久没写blog,做知识归纳整理了.本来设计模式就是个坑,各种文章也写烂了.不过,不是自己写的东西,缺少点知识的存在感.目前还没做到光看即能记住,得写.所以准备跳入设计模式这个大坑. 开篇先贡 ...

  5. [工作中的设计模式]单例模式singleton

    一.模式解析: 单例模式是最简单和最常用的设计模式,面试的时候,不管新毕业的学生还是已经工作多年的筒子,对单例模式基本都能聊上两句.单例模式主要体现在如下方面: 1.类的构造函数私有化,保证外部不能直 ...

  6. 23种设计模式--单例模式-Singleton

    一.单例模式的介绍 单例模式简单说就是掌握系统的至高点,在程序中只实例化一次,这样就是单例模式,在系统比如说你是该系统的登录的第多少人,还有数据库的连接池等地方会使用,单例模式是最简单,最常用的模式之 ...

  7. 设计模式--单例模式Singleton(创建型)

    单例模式很显然是定义一个类,这个类在程序中只有唯一的实例对象.一般单例类的构造函数是私有的,只能通过调用静态函数GetInstance来获取实例. 一.单例模式有三种:懒汉式单例.饿汉式单例.登记式单 ...

  8. 设计模式--单例模式Singleton

    单例模式顾名思义整个程序下只有一个实例,例如一个国家只有一个皇帝,一个军队只有一个将军.单例模式的书写又分为饿汉模式和懒汉模式 饿汉模式   类中代码 package demo; public cla ...

  9. 设计模式——单例模式(Singleton)

    保证一个类仅有一个实例,并提供一个访问它的全局访问点.——DP UML类图 模式说明 个人认为单例模式是所有设计模式中最为简单的一个模式,因为实现这个模式仅需一个类,而不像其他模式需要若干个类.这个模 ...

  10. 设计模式-单例模式(Singleton) (创建型模式)

    //以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码 //Singleton.h #pragma once #include<iostream> class Sin ...

随机推荐

  1. 使用autotools系列工具自动部署源代码编译安装

    在Linux系统下开发一个较大的项目,完全手动建立Makefile是一件费力而又容易出错的工作.autotools系列工具只需用户输入简单的目标文件.依赖文件.文件目录等就可以比较轻松地生成Makef ...

  2. Vim杂记:Sublime的配色方案

    一.前言 爱美之心人皆有之,sublime的配色实在好看,于是希望Vim也能这样. 二.配置 1.下载monokai(https://github.com/sickill/vim-monokai),然 ...

  3. Node之集群

    介绍 众所周知,Node.js运行在Chrome的JavaScript运行时平台上,我们把该平台优雅地称之为V8引擎.不论是V8引擎,还是之后的Node.js,都是以单线程的方式运行的,因此,在多核心 ...

  4. iOS第三方类库汇总【持续更新】

    在我们平时开发中会经常使用一些第三方开发的开源类库.这样会有效地提高我们开发项目的效率,在这里我找了好几十个进行一个汇总,供大家参考使用,方便大家在需要的时候能容易找到. UI篇 awesome-io ...

  5. 虚拟机service network restart没有反应解决方法

      一般我们新copy的虚拟机或新克隆的虚拟机第一次启动时都会出现没有ip地址的情况: [root@zejin243 network-scripts]# ifconfig lo        Link ...

  6. thread_Semaphore信号量

    Semaphore也是一个线程同步的辅助类,可以维护当前访问自身的线程个数,并提供了同步机制.  使用Semaphore可以控制同时访问资源的线程个数,例如,实现一个文件允许的并发访问数. 一个计数信 ...

  7. 甲骨文白桃花心木P6 EPPM 8.2项目点提供样本

    甲骨文白桃花心木样例代码 除非明确确定,这里的示例代码不是认证或Oracle支持;它只是用于教育或测试的目的. 你必须接受 许可协议下载此示例代码.  接受 许可协议 |  下降 许可协议   的名字 ...

  8. c# 正则表达式 匹配中括号&颜色过滤

    现在需要匹配 [color=#000000],以"[color"开头,以"[/color]"结束,中间字符数量不限制,最后返回所有匹配的下标. 代码如下: // ...

  9. Oracle基本操作汇总

    --10g 新增的表空间类型:大文件 (Bigfile) 表空间.--10g 数据库在创建的时候,会指定默认的表空间类型.如果不特殊指定的话,默认为 SMALLFILE 类型的表空间.SELECT * ...

  10. 10个Web设计的SEO规则

    规则0:不要试图作*弊来提升SEO效果.当你踏入一个房间:里面汇集了手拿各种博士文凭的科学家,你认为你会聪明过他们吗?当然不会.Google和百度拥有成百上千个这样的房间,里面的工作人员都是高学历的技 ...