iOS模式解析-单例模式

2017-12-09  本文已影响8人  aron1992

设计模式-单例模式

1、为什么用单例模式

1.1、OC编程习惯

xcode 4.2之前使用MRC
alloc创建的对象需要手动release
xcode4.2之后使用ARC
自动释放内存

1.2、 使用场景

常用到的资源共享的场景:

数据库文件、设置存储文件、缓存文件等的共享并发操作
1、IO操作是资源密集型的操作,这种情形如果存在多个实例会导致资源消耗严重
2、在多个地方操作同一个文件会存在数据不一致的问题
3、共享使用单例容易管理
IOS系统中的设置存储文件操作管理者NSUserDefaults、缓存文件管理者NSURLCookieStorage都是使用单例的设计模式

IOS系统中的消息中心NSNotificationCenter在APP内全局处理通知的收发;
UIApplication管理APP进程中事件队列(基于NSRunLoop事件循环)、UIApplication全局处理URL、UIApplication全局处理推送通知的接收

iOS系统中的单例
UIApplication 管理全局的设置和事件

NSUserDefaults 管理全局的用户数据
NSNotificationCenter 管理全局的通知监听
NSURLCookieStorage 管理全局的Cookie
NSFIleManager 管理全局的文件操作
NSURLCache
UIAccelerometer

开发过程中常用到的单例

2、单例模式的使用

2.1、单例模式的特点

2.1.1、有且只有一个实例
2.1.2、必须自行创建一个实例
2.1.3、必须提供一个全局的唯一访问点,一般是一个静态的公有方法
2.1.4、必须是线程安全的,在多线程环境中不能创建多个对象

2.2、角色划分

2.2.1、单例类
2.2.2、客户端使用者

2.3、如何实现

2.3.1、提供一个静态的实例
2.3.2、提供一个静态的类方法,创建和返回静态实例
2.3.3、保证初始化只有一个实例对象

2.4、几种实现方式

2.4.1、普通的单例模式
2.4.2、线程安全的单例模式,使用GCD
2.4.3、load方法创建的单例模式,饿汉式的创建,应用程序加载运行的时候就会调用,不会等到用户手动调用,如果单例对象创建是耗时操作,或者有依赖到其他的对象创建、避免使用这种方式

2.5、单例的继承处理
swift可以使用final修饰类,处理单例类不可被继承
swift可以定义private的构造方法,单例模式的设计更加的标准
swift 使用静态属性实例化: private static let instance = SingleTon();创建的对象相当于OC中使用GCD创建的单例对象,并且是线程安全的。
swift 使用结构体实现单例:线程安全

private class var shareInstance = SingleTon() {
    struct Static {
        static let instance = SIngleTon()
    }
    return Static.instance;
}

Java使用双重检查保证了线程安全以及效率和性能

if (instalce == null) {
    synchronized (SingleTon.class) {
        if (instalce == null) {
            instance = new SingleTon();
        }       
    }
}
上一篇 下一篇

猜你喜欢

热点阅读