iOS常用设计模式之单例模式

单例模式是iOS设计模式中常用的一种设计模式,它的意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式的作用就是为了解决“应用中只有一个实例”这一类问题。

单例模式一般会封装一个静态属性,并提供静态实例的创建方法。下面上代码:

//
//  Singleton.h
//  DesignPatternsDemo
//
//  Created by 韩学鹏 on 15/6/19.
//  Copyright (c) 2015年 韩学鹏. All rights reserved.
//

#import @interface Singleton : NSObject

+ (Singleton *)shareManager;

@end
//
//  Singleton.m
//  DesignPatternsDemo
//
//  Created by 韩学鹏 on 15/6/19.
//  Copyright (c) 2015年 韩学鹏. All rights reserved.
//

#import "Singleton.h"

@implementation Singleton

static Singleton *_shareManager = nil;

+ (Singleton *)shareManager {
    static dispatch_once_t once;
    dispatch_once(&once, ^{
        _shareManager = [[self alloc] init];
    });

    return _shareManager;
}

@end

如果使用者能严格按照要求来使用给定的方法,这个单例还是可以的,但是,如果不小心调用了其他可以生成对象的方法,那这个单例就失去了它的作用。所以,这个单例还需要改造:

1、重写allocWithZone方法,保证使用者在调用alloc或者init的时候不会产生新的对象。

2、重写copyWithZone和mutableCopyWithZone方法,保证使用者在进行对象复制的时候不会产生新的对象。

3、看情况重写retain、retainCount、release和autorelease方法。(ARC模式下需要注释掉)

重新改造的单例如下:

//
//  Singleton.m
//  DesignPatternsDemo
//
//  Created by 韩学鹏 on 15/6/19.
//  Copyright (c) 2015年 韩学鹏. All rights reserved.
//

#import "Singleton.h"

@implementation Singleton

static Singleton *_shareManager = nil;

+ (Singleton *)shareManager {
    static dispatch_once_t once;
    dispatch_once(&once, ^{
        _shareManager = [[self alloc] init];
    });
    return _shareManager;
}

+ (id)allocWithZone:(struct _NSZone *)zone {
    static dispatch_once_t once;
    dispatch_once(&once, ^{
        _shareManager = [super allocWithZone:zone];
    });

    return _shareManager;
}

- (id)copyWithZone:(NSZone *)zone {
    return _shareManager;
}

- (id)mutableCopyWithZone:(NSZone *)zone {
    return [self copyWithZone:zone];
}
/*   ARC无效时
- (id)retain {
    return _shareManager;
}

- (NSUInteger)retainCount {
    return 1;
}

- (oneway void)release {

}

- (id)autorelease {
    return _shareManager;
}
*/

@end

测试代码和输入输出结果:

    id obj = [Singleton new];
    id obj1 = [Singleton shareManager];
    id obj2 = [[Singleton alloc] init];

    NSLog(@"obj:%@", obj);
    NSLog(@"obj1:%@", obj1);
    NSLog(@"obj2:%@", obj2);

输出:

2015-06-19 19:15:27.452 DesignPatternsDemo[24125:607] obj:2015-06-19 19:15:27.453 DesignPatternsDemo[24125:607] obj1:2015-06-19 19:15:27.453 DesignPatternsDemo[24125:607] obj2:

附上这个类的下载地址:单例

时间: 2024-12-26 00:13:28

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

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

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

iOS.常用设计模式.02.委托模式

WTDelegate #import <Foundation/Foundation.h> @protocol WTDelegate <NSObject> @required - (void)sleep; - (void)eat; - (void)work; @end WTPhilosopher.h #import <Foundation/Foundation.h> #import "WTDelegate.h" @interface WTPhiloso

IOS常用设计模式——单例模式(IOS开发)

IOS常用的设计模式包括:单例模式.委托模式.观察者模式和MVC模式. 这里主要讲单例模式 单例模式 -问题: 主要解决应用中只有一个实例的问题(只需要某个类的实例) -原理:一般会封装一个静态属性,并提供静态实例的创建方法 -应用:单例类 // Singleton.h @interface Singleton : NSObject + (Singleton *)sharedManager; @property (nonatomic, strong) NSString* stingletonDa

Java常用的设计模式03:常用设计模式之单例模式

1.java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种. 单例模式有一下特点: 1.单例类只能有一个实例. 2.单例类必须自己自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例.这些应用都或多或少具有资源管理器的功能.每台计算机可以有若干个打印机,但只能有一个Printer

iOS常用设计模式——单例模式

第一部分: 创建一个单例对象 单例的应用场景: 单例模式用于当一个类只能有一个实例的时候, 通常情况下这个"单例"代表的是某一个物理设备比如打印机,或是某种不可以有多个实例同时存在的虚拟资源或是系统属性比如一个程序的某个引擎或是数据.用单例模式加以控制是非常有必要的. 什么是单例模式? 单例是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为. 单例设计模式需要达到下面几个目的:1.

iOS常用设计模式——单例设计模式

单例设计模式详解 单例设计模式详解 基本概念 在IOS中使用单例模式的情况 非ARC环境创建单例模式的基本步骤 非ARC环境具体代码实现 ARC环境创建单例模式的基本步骤 基本概念 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问 在IOS中使用单例模式的情况 1.如果说创建一个对象会耗费很多系统资源,那么此时采用单例模式,因为只需要一个实例,会节省alloc的时间 2.在IOS开发中,如果很多模

iOS常用设计模式——适配器Adapter

1.什么是适配器设计模式(Adapter)   (What) 适配器设计模式是一种结构型设计模式, 它的作用是把一个类的接口转换成客户希望的另外一个接口,从而使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 适配器设计模式有两种实现方式:1.)通过继承来实现两个接口,叫类适配器: 2.)通过引用来避免对象适配器继承被适配对象,叫对象适配器. 图1: 类适配器的UML图 在类适配器中,Adapter与Adaptee之间的关系是继承,我们通过继承来实现对Adaptee中+ specific

iOS开发指南 第8章 iOS常用设计模式 学习

设计模式是在特定场景下对特定问题的解决方案 1 单例模式 作用:解决“应用中只有一个实例”的问题,这个实例的作用是全局的,比如说是可以实现一些共享资源 方法的访问和状态的保持 实现原理:一般会封装一个静态属性,并提供静态实例的创建方法. *********** James Rumbaugh对类的定义是:类是具有相似结构.行为和关系的一组对象的描述符.类是面向对象系统中最重要的构造块.类图显示了一组类.接口.协作以及他们之间的关系. 建立类图的步骤: (1)研究分析问题领域确定系统需求. (2)确

iOS常用设计模式——命令设计模式

命令设计模式详解 命令设计模式详解 基本概念 NSInvocation的使用 命令模式的体现 基本概念 命令设计模式将一个请求或行动作封装为对象.这个封装请求比原始的请求要灵活并且可以在对象之前被传递,存储,动态修改或者放进队列里面.苹果公司实现这种模式使用Target-Action机制和Invocation. NSInvocation的使用 在 iOS中可以直接调用 某个对象的消息 方式有2种 一种是performSelector:withObject:再一种就是NSInvocation第一种