单例模式

基础理解

  • 所有类都有构造方法,不编码则系统默认生成空的构造方法,若有显示定义的构造方法,默认的构造方法就会失效。
  • 单例模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点。

    *通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是:让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。
  • 单例模式的意图是使得类的一个对象成为系统中的唯一实例。

好处

  • 单例模式可以保证唯一的实例。
  • 单例模式因为类本身封装了它的唯一实例,这样它可以严格地控制客户怎么样访问他以及何时访问他。简单来说就是对唯一实例的受控访问。

多线程中的单例

  • 在多线程程序中,多个线程同时,值得注意的是同时访问单例的构造方法,会有可能造成创建多个实例的。所以我们需要把进程加一把锁来处理。lock 是确保当一个线程位于代码的临界区时,另一个线程不进去临界区。如果其他线程试图进入锁定的代码,则它将一直等待,知道该对象被释放。
  • 双重锁定

    我们不用让线程每次都加锁,而只是在实例未被创建的时候再加锁处理。同时也能保证多线程的安全。这种做法被称为Double-Check Locking(双重锁定)。
  • 饿汉式单例类:静态初始化的方式是在自己被加载时就将自己实例化。
  • 懒汉式单例类:要在第一次被引用时,才会将自己实例化。
  • 懒汉式和饿汉式比较

    由于类一加载就实例化对象,所以要提前占用系统资源。而懒汉式又会面临着多线程访问的安全性问题,需要做双重锁定这样的处理才能保证安全。从C#语言的角度来讲,饿汉式单例类已经满足我们的需求了。

使用单例的情况

  • 类中只能有一个实例,而且必须从一个为人熟知的访问点对其进行访问。
  • 这个唯一的实例只能够通过子类化进行扩展,而且扩展的对象不会破坏客户端代码。

在Cocoa Touch中使用单例模式

  • 使用UIApplication类。这是框架中最为常用的一个单例类,他提供了一个控制并协调iOS应用程序的集中点。
  • 使用UIAccelerometer类。该类让应用程序可以进行注册,以接收来自iOS设备内置的加速计的加速度相关数据。应用程序会收到三维空间中沿主轴的线性加速度变化,可以使用这一数据监测设备的当前方向和当前方向的瞬间变化。
  • 使用NSFileManager类。

例子

Singleton.h

//
// Singleton.h
// SingletonDemo
//
// Created by zhanggui on 15/8/6.
// Copyright (c) 2015年 zhanggui. All rights reserved.
// #import <Foundation/Foundation.h> @interface Singleton : NSObject +(instancetype)sharedInstance;
@end

Singleton.m

//
// Singleton.m
// SingletonDemo
//
// Created by zhanggui on 15/8/6.
// Copyright (c) 2015年 zhanggui. All rights reserved.
// #import "Singleton.h" @implementation Singleton +(instancetype)sharedInstance {
static Singleton *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
@end

上面这种方式是最安全也是最有效的创建单例的方式。不可能去创建两个实例,而且使100%的线程安全。

总结

  • 几乎在任何的应用程序中,单例模式都极为常用,并不只限于iOS应用程序开发。
  • 只要应用程序需要用集中式的类来协助其服务,这个类就应生成单一的实例,而不是多个实例。

附:

iOS设计模式之单例模式的更多相关文章

  1. iOS设计模式(02):单例模式

    iOS设计模式(02):单例模式 singleton-design-pattern 什么是单例模式? 单例模式是一个类在系统中只有一个实例对象.通过全局的一个入口点对这个实例对象进行访问.在iOS开发 ...

  2. iOS设计模式-单例模式

    (一)什么是单例模式(Singleton) 单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点 *最初的定义是在<设计模式>(Addison-Wesley)中 解读 1> ...

  3. IOS设计模式之一(MVC模式,单例模式)

    iOS 设计模式-你可能已经听说过这个词,但是你真正理解它意味着什么吗?虽然大多数的开发者可能都会认为设计模式是非常重要的,然而关于设计模式这一主题的文章却不多,并且有时候我们开发者在写代码的时候也不 ...

  4. IOS设计模式浅析之单例模式(Singleton)

    说在前面 进入正式的设计模式交流之前,扯点闲话.我们在项目开发的过程中,经常会不经意的使用一些常见的设计模式,如单例模式.工厂方法模式.观察者模式等,以前做.NET开发的时候,认真拜读了一下程杰老师的 ...

  5. iOS设计模式——单例模式

    单例模式用于当一个类只能有一个实例的时候, 通常情况下这个“单例”代表的是某一个物理设备比如打印机,或是某种不可以有多个实例同时存在的虚拟资源或是系统属性比如一个程序的某个引擎或是数据.用单例模式加以 ...

  6. 浅谈iOS中的单例模式

    iOS中的单例模式     就我本身理解而言,我认为的单例:单例在整个工程中,就相当于一个全局变量,就是不论在哪里需要用到这个类的实例变量,都可以通过单例方法来取得,而且一旦你创建了一个单例类,不论你 ...

  7. IOS开发中单例模式使用详解

    第一.基本概念 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问. 第二.在IOS中使用单例模式的情 ...

  8. iOS书摘之Objective-C编程之道 iOS设计模式解析

    来自<Objective-C编程之道iOS设计模式解析>一书的摘要总结 一.Prototype 原型模式 定义:使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象.(<设 ...

  9. iOS 设计模式

    很赞的总结 iOS Design Patterns 中文版 IOS设计模式之一(MVC模式,单例模式) IOS设计模式之二(门面模式,装饰器模式) IOS设计模式之三(适配器模式,观察者模式) IOS ...

随机推荐

  1. linux ckconfig

    linux自定义开机启动服务和chkconfig使用方法 linux自定义开机启动服务和chkconfig使用方法 1. 服务概述在linux操作系统下,经常需要创建一些服务,这些服务被做成shell ...

  2. 在Visual Studio 2010中进行“项目重命名”的有效工具

    地址:http://www.cnblogs.com/dudu/archive/2011/12/11/visual_studio_2010_project_rename.html 提示:这个工具一次 r ...

  3. Popup 显示阴影

    WPF Popup: How to put a border around the popup? 通过设置 Border 的 margin 来为阴影留出位置,并设置 Popup: AllowsTran ...

  4. B2B多商铺初期权限数据库设计

    项目从无到有,两个月了.一期完成. 权限目前还很简单.USER表,ROLE表,RESOURCE表三个. 目前只有两个商铺.id是0的是我们自己,作为后台运维管理,也抽象成一个商铺,id为0.另一个商铺 ...

  5. Knockout 新版应用开发教程之"visible"绑定

    "visible" 绑定 用途 DOM元素的显示或者隐藏是根据绑定的值来的,前提是将visible绑定给该元素 例子 <div data-bind="visible ...

  6. 析构函数和Dispose的使用区别

    老生常谈的问题了,MSDN也有非常详细的说明但看起来不是很系统.也曾经做过分析,但没有总结下来又忘了,这次整理一下MSDN和网上搜集的一些资料,以备不时只需. 下面是MSDN对这两个函数的建议使用方法 ...

  7. 玩转PowerShell第三节——【SCOM Maintenance Mode】-技术&分享

    概述 Microsoft System Center Operations Manager 2007 sp1(SCOM)是微软推出的专业系统监控软件,可以监控部署在网络中的服务器.应用系统和客户端,提 ...

  8. Google Kubernetes设计文档之服务篇-转

    摘要:Kubernetes是Google开源的容器集群管理系统,构建于Docker之上,为容器化的应用提供资源调度.部署运行.服务发现.扩容缩容等功能. Pod是创建.调度和管理的最小部署单位,本文详 ...

  9. Hadoop第6周练习—在Eclipse中安装Hadoop插件及测试(Linux操作系统)

    1    运行环境说明 1.1     硬软件环境 1.2     机器网络环境 2    :安装Eclipse并测试 2.1     内容 2.2     实现过程 2.2.1   2.2.2   ...

  10. Cool!12幅由小图片组成的创意图像重组作品

    这里分享15幅创意插图作品,这些创意插图作品都是有成千上万的小图片组成的,很多创意广告会采用这个形式的设计.下面这组创意作品的作者是 Charis Tsevis,来自希腊的视觉设计师,擅长图像重组的创 ...