单例模式(Singleton)

概念:整个应用或系统只能有该类的一个实例

在iOS开发我们经常碰到只需要某类一个实例的情况,最常见的莫过于对硬件参数的访问类,比如UIAccelerometer.这个类可以帮助我们获得硬件在各个方向轴上的加速度,但是我们仅仅需要它的一个实例就够了,再多,只会浪费内存。

苹果大量使用了此模式。例如:[NSUserDefaults standardUserDefaults], [UIApplication sharedApplication], [UIScreen mainScreen], [NSFileManager defaultManager],所有的这些方法都返回一个单例对象。

  • UIApplication类提供了 +sharedAPplication方法创建和获取UIApplication单例
  • NSBundle类提供了 +mainBunle方法获取NSBundle单例
  • NSFileManager类提供了 +defaultManager方法创建和获得NSFileManager单例。(PS:有些时候我们得放弃使用单例模式,使用-init方法去实现一个新的实例,比如使用委托时)
  • NSNotificationCenter提供了 +defaultCenter方法创建和获取NSNotificationCenter单例(该类还遵循了另一个重要的设计模式:观察者模式)
  • NSUserDefaults类提供了 +defaultUserDefaults方法去创建和获取NSUserDefaults单例

创建单例模式的五个步骤:

  1. 声明一个可以新建和获取单个实例对象的方法
  2. 声明一个static类型的类变量
  3. 声明一个只执行一次的任务
  4. 调用dispatch_once执行该任务指定的代码块,在该代码块中实例化上文声明的类变量
  5. 返回在整个应用的生命周期中只会被实例化一次的变量

下面用代码呈现:

//Singleton.h

@interface Singleton : NSObject

+ (Singleton *)sharedSingleton; //1声明一个可以新建和获取单个实例对象的方法

@end

/***************************************************************/

//Singleton.m

#import "Singleton.h"

@implementation Singleton   

static Singleton *sharedSingleton = nil;// 2声明一个static类型的类变量

+ (Singleton *)sharedSingleton{

    static dispatch_once_t  once; //3声明一个只执行一次的任务

    dispatch_once(&once,^{

        sharedSingleton = [[self alloc] init];// 调用dispatch_once执行该任务指定的代码块,在该代码块中实例化上文声明的类变量

        //dosometing

    });

    return sharedSingleton;// 返回在整个应用的生命周期中只会被实例化一次的变量(不止调用一次,但是只实例化一次)

}

实际运用:在iOS应用中实现分层的架构设计,即我们需要把数据持久层,业务逻辑层,和展示层分开。(PersistenceLayer、 BusinessLogiclayer 、 PresentationLayer)

根据MVC的设计模式,我们又可以把持久层细分为DAO层(放置访问数据对象的四类方法-增删改查)和Domain层(各种实体类,比如日期,文本内容等)(DAO:Data Access Object数据访问对象是一个面向对象的接口)

实现:封装一个单例,用于初始化路径,文件等

//  NoteDAO.h

#import <Foundation/Foundation.h>

#import "Note.h"

@interface NoteDAO : NSObject

+ (NoteDAO*)sharedInstance;

//插入Note方法

-(int) create:(Note*)model;

//删除Note方法

-(int) remove:(Note*)model;

//修改Note方法

-(int) modify:(Note*)model;

//查询所有数据方法

-(NSMutableArray*) findAll;

//按照主键查询数据方法

-(Note*) findById:(Note*)model;

@end

//  NoteDAO.m

#import "NoteDAO.h"

@interface NoteDAO() //声明NoteDAO扩展

//NoteDAO扩展中DateFormatter属性是私有的

@property (nonatomic,strong) NSDateFormatter *dateFormatter;

// NoteDAO扩展中沙箱目录中属性列表文件路径是私有的(所以不放在.h文件中声明)

@property (nonatomic,strong) NSString *plistFilePath;

@end

@implementation NoteDAO

static NoteDAO *sharedSingleton = nil;

+ (NoteDAO *)sharedInstance {

    static dispatch_once_t once;

    dispatch_once(&once, ^{

        sharedSingleton = [[self alloc] init];

        //初始化沙箱目录中属性列表文件路径

        sharedSingleton.plistFilePath = [sharedSingleton applicationDocumentsDirectoryFile];

        //初始化DateFormatter

        sharedSingleton.dateFormatter = [[NSDateFormatter alloc] init];

        [sharedSingleton.dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

        //初始化属性列表文件

        [sharedSingleton createEditableCopyOfDatabaseIfNeeded];

    });

    return sharedSingleton;

}

//初始化属性列表文件

- (void)createEditableCopyOfDatabaseIfNeeded {

。。。

}

- (NSString *)applicationDocumentsDirectoryFile {

}
- (int)create:(Note *)model { 。。。 } -(NSMutableArray*) findAll{
}

在业务逻辑层使用这个单例

//  NoteBL.m

#import "NoteBL.h"

@implementation NoteBL

//插入Note方法

-(NSMutableArray*) createNote:(Note*)model {

    NoteDAO *dao = [NoteDAO sharedInstance];

    [dao create:model];

    return [dao findAll];

}

iOS学习之单例模式的更多相关文章

  1. ios 学习路线总结

    学习方法 面对有难度的功能,不要忙着拒绝,而是挑战一下,学习更多知识. 尽量独立解决问题,而不是在遇到问题的第一想法是找人. 多学习别人开源的第三方库,能够开源的库一定有值得学习的地方,多去看别的大神 ...

  2. iOS学习笔记13-网络(二)NSURLSession

    在2013年WWDC上苹果揭开了NSURLSession的面纱,将它作为NSURLConnection的继任者.现在使用最广泛的第三方网络框架:AFNetworking.SDWebImage等等都使用 ...

  3. iOS学习-压缩图片(改变图片的宽高)

    压缩图片,图片的大小与我们期望的宽高不一致时,我们可以将其处理为我们想要的宽高. 传入想要修改的图片,以及新的尺寸 -(UIImage*)imageWithImage:(UIImage*)image ...

  4. 【原】iOS学习之事件处理的原理

    在iOS学习23之事件处理中,小编详细的介绍了事件处理,在这里小编叙述一下它的相关原理 1.UITouch对象 在触摸事件的处理方法中都会有一个存放着UITouch对象的集合,这个参数有什么用呢? ( ...

  5. iOS学习笔记——AutoLayout的约束

    iOS学习笔记——AutoLayout约束 之前在开发iOS app时一直以为苹果的布局是绝对布局,在IB中拖拉控件运行或者直接使用代码去调整控件都会发上一些不尽人意的结果,后来发现iOS在引入了Au ...

  6. ios 开发之单例模式

    在iOS开发中,有很多地方都选择使用单例模式.有很多时候必须要创建一个对象,并且不能创建多个,用单例就为了防止创建多个对象.单例模式的意思就是某一个类有且只有一个实例.单例模式确保某一个类只有一个实例 ...

  7. 【原】iOS学习47之第三方-FMDB

    将 CocoaPods 安装后,按照 CocoaPods 的使用说明就可以将 FMDB 第三方集成到工程中,具体请看博客iOS学习46之第三方CocoaPods的安装和使用(通用方法) 1. FMDB ...

  8. iOS学习路线图

    一.iOS学习路线图   二.iOS学习路线图--视频篇       阶 段 学完后目标 知识点 配套学习资源(笔记+源码+PPT) 密码 基础阶段 学习周期:24天       学习后目标:    ...

  9. 黑苹果-IOS学习的开始

    深知安装黑苹果的不易,在这里写一下关于我的Thinkpad E430c安装黑苹果教程(Mac版本:Yosemite 10.10.4),希望能够帮助有需要的朋友. 首先贴上我的电脑配置报表: ----- ...

随机推荐

  1. adb命令学习

    录制屏幕操作Android4.4版本以上支持录制屏幕 adb shell screenrecord /sdcard/demo.mp4 ADB logcat 输出时间信息: adb logcat -v ...

  2. Centos7下配置Redis开机自启动

    最近在做作业的时候需要用到Redis缓存,由于每次重启服务器都需要重新启动Redis,也是忒烦人,于是就有了这一篇博客,好,废话不多说. 只有两个步骤: 设置redis.conf中daemonize为 ...

  3. 【转】OPENGL基本API概述

    本文信息资源来源于网络,欢迎转载!转载时请保留本文链接(http://www.shopliyang.com.cn/)! OpenGL中的gl库是核心库,glu是实用库,glut是实用工具库. gl是核 ...

  4. Python中 "+=" 使用时的注意事项

    代码1: >>> l1=range(3) >>> l2=l1 >>> l2+=[4] >>> l1 [0, 1, 2, 4] & ...

  5. JS根据登录的城市不同调用不同的内容

    这个思路就是通过js获取访问客户的IP地址,根据IP接口判断IP的所属城市 1.先引入ip接口的js文件,网上有很多,这里用的是新浪的(感谢新浪) <script type="text ...

  6. Oracle 11g密码过期问题解决方案

    [问题描述]近日,使用sqlplus登陆短消息Oracle(Oracle培训 )数据库时提示“ORA-28000: 帐号被锁定”.[原因/触发因素]确定是由于oracle11g中默认在default概 ...

  7. IIS 7.5最新解析漏洞

    IIS7.5解析漏洞 http://www.cnk0n9.com/fckeditor/editor/fckeditor.html, 上传图片,浏览,上传一个aspx的一句话木马,名字为:a.aspx. ...

  8. golang使用 mongo

    连接集群 mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?op ...

  9. Android ADB 用法

    adb  全称是 Android Debug Bridge, 就是起到调试桥的作用. 用来操作android设备的 阅读目录 adb 有什么用 借助adb工具, 我们可以管理设备或手机模拟器的状态,  ...

  10. 超酷震撼 HTML5/CSS3动画应用及源码

    HTML5可以制作非常华丽的动画效果,这点通过之前的分享学习我们已经有深刻的了解了,今天我们主要来分享一些HTML5结合CSS3形成的超炫震撼的动画应用以及它们的源代码,真的非常不错. 1.纯CSS3 ...