iOS设计模式之单例模式

单例模式

基础理解

  • 所有类都有构造方法,不编码则系统默认生成空的构造方法,若有显示定义的构造方法,默认的构造方法就会失效。
  • 单例模式(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应用程序开发。
  • 只要应用程序需要用集中式的类来协助其服务,这个类就应生成单一的实例,而不是多个实例。

附:

时间: 2024-10-30 13:38:18

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

iOS设计模式 - 单例模式

IOS设计模式单例类 Made By HeYang 内容大纲: 1.单例模式 2.编写严格的单例 3.利用单例模式优化本地存储 4.重写allocWithZone实现单例 5.使用异常处理强制避免init创建实例 6.MRC下的单例模式,然后宏定义抽取单例类(兼顾ARC和MRC) 7.附录 1.单例模式 单例模式的描述: 系统中的一个类只提供一个实例供外界使用. 下面举几个IOS开发中常用的几个单例: [[UIApplication sharedApplication] statusBarFra

iOS设计模式 - 单例

iOS设计模式 - 单例   原理图   说明 1. 单例模式人人用过,严格的单例模式很少有人用过 2. 严格的单例模式指的是无法通过常规的 alloc init 方法来生成对象,派生出来的子类也不能产生出对象,而只能通过单例的方法获取到对象   源码 https://github.com/YouXianMing/iOS-Design-Patterns // // Singleton.h // SingletonPattern // // Created by YouXianMing on 15

iOS设计模式 - 中介者

iOS设计模式 - 中介者   原理图   说明 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 注:中介者对象本身没有复用价值,只是将逻辑操作封装在一个类里面而已   源码 https://github.com/YouXianMing/iOS-Design-Patterns // // TextFieldMediator.h // MediatorPattern // // Created by YouXianMi

iOS设计模式 - 适配器

iOS设计模式 - 适配器   效果   说明 1. 为了让客户端尽可能的通用,我们使用适配器模式来隔离客户端与外部参数的联系,只让客户端与适配器通信. 2. 本教程实现了适配器模式的类适配器与对象适配器两种模式,各有优缺点. 3. 如果对面向对象基本原理以及设计模式基本原理不熟悉,本教程会变得难以理解.   源码 https://github.com/YouXianMing/iOS-Design-Patterns // // BusinessCardView.h // Adapter // /

php设计模式之单例模式实例分析

 这篇文章主要介绍了php设计模式之单例模式,实例分析了单例模式的原理与相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了php设计模式之单例模式.分享给大家供大家参考.具体分析如下: 单例模式(职责模式): 简单的说,一个对象(在学习设计模式之前,需要比较了解面向对象思想)只负责一个特定的任务: 单例类: 1.构造函数需要标记为private(访问控制:防止外部代码使用new操作符创建对象),单例类不能在其他类中实例化,只能被其自身实例化: 2.拥有一个保存类的实

深入理解JavaScript系列(25):设计模式之单例模式详解

 这篇文章主要介绍了深入理解JavaScript系列(25):设计模式之单例模式详解,本文给出了多种单例模式的实现方式,需要的朋友可以参考下     介绍 从本章开始,我们会逐步介绍在JavaScript里使用的各种设计模式实现,在这里我不会过多地介绍模式本身的理论,而只会关注实现.OK,正式开始. 在传统开发工程师眼里,单例就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返回,这就确保了一个类只有一个实例对象.在JavaScript里,单例

iOS设计模式 - 桥接

iOS设计模式 - 桥接   示意图   说明 1. 桥接模式为把抽象层次结构从实现中分离出来,使其可以独立变更,抽象层定义了供客户端使用的上层抽象接口,实现层次结构定义了供抽象层次使用的底层接口,实现类的引用被封装于抽象层的实例中,桥接就形成了. 2. 桥接模式可以解决具有功能类似但又不完全相同的某种功能架构,为了能让实现更加灵活.   源码 https://github.com/YouXianMing/iOS-Design-Patterns // // ConsoleController.h

iOS设计模式 - 策略

iOS设计模式 - 策略   效果   说明 1. 把解决相同问题的算法抽象成策略(相同问题指的是输入参数相同,但根据算法不同输出参数会有差异) 2. 策略被封装在对象之中(是对象内容的一部分),策略改变的是对象的内容.如果从外部扩展了对象的行为,就不叫策略模式,而是装饰模式. 3. 策略模式可以简化复杂的判断逻辑(if - else) 4. 如果对面向对象基本原理以及设计模式基本原理不熟悉,本教程会变得难以理解.   源码 https://github.com/YouXianMing/iOS-

iOS设计模式 - 代理

iOS设计模式 - 代理   原理图   说明 1. 代理模式大家都用过,但用抽象基类NSProxy实现代理估计鲜有人用 2. 本人用NSProxy实现了代理模式,对于理解消息转发机制有点帮助   源码 https://github.com/YouXianMing/iOS-Design-Patterns // // AbstractProxy.h // AppProxy // // Created by YouXianMing on 15/8/4. // Copyright (c) 2015年