美文网首页
【iOS-设计模式】创建型之单例模式

【iOS-设计模式】创建型之单例模式

作者: GSNICE | 来源:发表于2020-03-27 16:11 被阅读0次

单例模式是一种很常见的设计模式,单例理解起来也很简单,就是不管如何访问始终只有一个实例化对象,定义全局共享的变量,如果对象是空则初始化一个对象,如果对象已经存在则使用已经实例化的对象。单例设计模式的作用是使得这个类的一个对象成为系统中的唯一实例,因此需要用一种唯一的方法去创建这个对象并返回这个对象的地址。下面有一张苹果官网的图片可以参考一下:

单例模式

定义一个 Work 类,项目共享同一个工作处理类,定义一个静态变量,一个实例方法:

static Work *sharedWorkObj = nil;
 
+ (Work *)sharedWork{
    if (!sharedWorkObj) {
        sharedWorkObj=[[Work alloc]init];
    }
    return sharedWorkObj;
}

执行以下代码,最后发现两个实例对象 work 和workNext 地址是一样的:

Work *work = [Work sharedWork];
Work *workNext = [Work sharedWork];
NSLog(@"共享地址:%p - 共享地址:%p",work,workNext);

如果每次都遵守规则调用 sharedWork 方法,单例模式算是完成了,但是对象是可以实例化的,看一段下面的代码:

Work *work = [Work sharedWork];
Work *workInit = [[Work alloc] init];
NSLog(@"共享地址:%p-实例地址:%p",work,workInit);

work 和 workInit 的地址是不一样,这个时候我们需要动手改造以下改成的方法,让实例化对象的出来的地址也是一样的,这个时候需要重写 allocWithZone 方法:

+ (Work *)sharedWork{
    if (!sharedWorkObj) {
        sharedWorkObj=[[super allocWithZone:NULL] init];
    }
    return sharedWorkObj;
}
 
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
    return [self sharedWork];
}

如果对象拷贝的时候也需要是同一对象的话,可以加一个方法:

+ (id)copyWithZone:(struct _NSZone *)zone{
    return [self sharedWork];
}

如果为了确保多线程情况下,仍然确保实体的唯一性,这个时候可以加上 @synchronized,@synchronized 的作用是创建一个互斥锁,保证此时没有其它线程对 self 对象进行修改。这个是objective-c 的一个锁定令牌,防止 self 对象在同一时间内被其它线程访问,起到线程的保护作用。单例模式或者操作类的 static 变量中使用比较多。当两个并发线程访问同一个对象 @synchronized(self) 同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。

+ (Work *)sharedWork{
    @synchronized(self){
        if (!sharedWorkObj) {
            sharedWorkObj=[[Work alloc] init];
        }
    }
    return sharedWorkObj;
}

苹果 Mac OS 10.6 和 iOS4.0 后引入了 GCD,利用 GCD(Grand Central Dispatch)和ARC(Automatic Reference Counting)实现单例,这个时候我们可以通过 dispatch_once 简单的实现,代码如下:

+ (instancetype)sharedInstance
{
    static Work *sharedWorkObj = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedWorkObj =[[super allocWithZone:NULL] init];
    });
     
    return sharedWorkObj;
}

Work.m中的代码:

#import "Work.h"
 
@implementation Work
 
static Work *sharedWorkObj = nil;
 
+ (Work *)sharedWork{
    if (!sharedWorkObj) {
        sharedWorkObj = [[super allocWithZone:NULL] init];
    }
    return sharedWorkObj;
}
 
+ (id)copyWithZone:(struct _NSZone *)zone{
    return [self sharedWork];
}
 
- (id)copyWithZone:(NSZone *)zone
{
    return self;
}
 
+ (instancetype)sharedInstance
{
    static Work *sharedWorkObj = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedWorkObj =[[super allocWithZone:NULL] init];
    });
     
    return sharedWorkObj;
}
 
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
    return [self sharedInstance];
}
@end

相关文章

  • 单例模式

    单例 单例模式,是一种设计模式,属于创建型设计模式,还有一种创建型设计模式,工厂模式。设计模式总共有23种,三大类...

  • 开发之设计模式-单例模式

    设计模式 设计模式分为三大类:创建型、结构型、行为型在Java中有24中设计模式 创建型:单例 1、为什么用单例模...

  • 设计模式分类

    经典23种设计模式: 创建型设计模式: Singleton Pattern(单例模式) PrototypePatt...

  • Python 之单例模式

    简介:单例模式(Singleton Pattern) 是最简单的设计模式之一,属于创建型的设计模式。单例模式涉及到...

  • “Python的单例模式有四种写法,你知道么?”——孔乙己

    什么是单例模式 单例模式(Singleton Pattern)是最简单的设计模式之一。这种类型的设计模式属于创建型...

  • S4. 单例模式

    单例模式(Singleton) 介绍 单例模式是创建型设计模式,即用于创建对象的设计。其能够保证当前系统仅存在一个...

  • 设计模式简单总结(待完善)

    设计模式简单总结 设计模式可以分为:创建型,结构型,行为型三种模式。 1 创建型模式 1.1 单例模式 用来指定某...

  • PHP设计模式—创建型设计模式

    ** 创建型设计模式 **: 单例模式(Singleton Pattern) 工厂方法模式(Factor Patt...

  • 【设计模式】创建型设计模式汇总

    创建型设计模式汇总 1. 单例模式 1.1 单例模式的定义 一个类只允许创建一个对象或实例。 1.2 单例模式的作...

  • 23种设计模式学习总结

    创建型设计模式 主要解决对象的创建问题,封装复杂的创建过程,解耦对象的创建代码合使用代码。 单例模式 单例模式用来...

网友评论

      本文标题:【iOS-设计模式】创建型之单例模式

      本文链接:https://www.haomeiwen.com/subject/tkzluhtx.html