单例模式(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. loadrunner json

    Action(){ web_custom_request("JRPT_WriteLog", //VuGen中树形视图中显示的名称 "Url=url", //请求 ...

  2. Git常用命令速查表

  3. DOM加载顺序

    最近一直在困扰dom的加载顺序问题,经常会遇到以为绑定好的事件不响应等情况,一头雾水,直到请教了周围的同事,才发现了解dom的加载顺序是多么的重要. 关于这个问题,其实网上已经有一些介绍,但是我觉得并 ...

  4. java list 简述

    list中可以添加任何对象,我可以给你举个例子:class Person{ .....}上面定义了一个Person类,下面看好如何使用ListPerson p1=new Person();Person ...

  5. ArcGIS Engine控件运行许可(转)

    ArcGIS Engine控件运行许可   Runtime绑定: 在ArcGIS Engine10.0中,许可方式发生了一定的变化,ArcGis10有一个新的要求---runtime绑定.就是在任何A ...

  6. sqlite数据库的使用helper

    public class SQLiteHelper     {         //public static String ConnectionString = "Data Source= ...

  7. 学习iOS

    最近想学习一下iOS开发,不过一点基础都没有,得先从熟悉object-C语法开始,在此把学习中的一些知识点作为记录. mac pro常用操作 学习ios[1]Objective-C 基本语法 学习io ...

  8. marquee标签实现页面内容的滚动效果

    页面的自动滚动效果,可由javascript来实现, 但是有一个html标签 - <marquee></marquee>可以实现多种滚动效果,无需js控制. 使用marquee ...

  9. C# Out,Ref 学习总结

    C# Out,Ref 学习总结. ref是传递参数的地址,out是返回值,两者有一定的相同之处,不过也有不同点. 使用ref前必须对变量赋值,out不用. out的函数会清空变量,即使变量已经赋值也不 ...

  10. 无废话SharePoint入门教程二[SharePoint发展、工具及术语]

    一.前言 1.由于上一篇文章的标题命名失误,此篇标题写给百度搜索”什么是SharePoint”. 2.关于什么是SharePoint,请参见本人的第一篇文章:http://www.cnblogs.co ...