Singleton Pattern 单例模式

Singleton pattern:单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

以上内容来自百度百科

单例模式的基本思路:


  1. 为单例对象实现一个静态实例,设置成 nil。
  2. 调用时检查是否为 nil,是则创建否则直接使用。
  3. 修改alloc等方法,预防被创建新实例。
  4. 本质上,每次调用单例对象的实例方法,就只是创建了指针来指向该单例对象已经分配好的内存。

Objective - C 实现单例方法1


  • 在 .h 文件中加入类工厂方法:
#import <Foundation/Foundation.h>

@interface SingletonGeekBand : NSObject

+(SingletonGeekBand *)shared;

@end
  • 在 .m 文件中加入方法实现。
 #import "SingletonPattern.h"

// 建立静态变量
static SingletonPattern * shared = nil;

@implementation SingletonPattern

// 类工厂方法,如果 shared 还没初始化则初始化,否则直接调用
+ (SingletonPattern *)shared {
    // 确保单线程
    @synchronized(self) {
        if (shared == nil) {
            shared = [[self alloc] init];
        }
    }
    return shared;
}

// 重写 alloc 方法,确保不会被重新分配新的实例内存。
+(instancetype)alloc {
    @synchronized(self) {
        if (shared == nil) {
            shared = [super alloc];
            return shared;
        }
    }
    return shared;
}

// 重写 allocWithZone
+ (id)allocWithZone:(struct _NSZone *)zone {
    @synchronized(self) {
        if (shared == nil) {
            shared = [super allocWithZone:zone];
            return shared;
        }
    }
    return nil;
}

// 重写 copyWithZone
+ (id)copyWithZone:(NSZone *)zone {
    return self;
}

@end

Objective - C 实现单例方法2


  • 在 .h 文件中加入类工厂方法:
#import <Foundation/Foundation.h>

@interface Singleton : NSObject

+ (instancetype) shareInstance;

@end
  • 在 .m 文件中加入方法实现。
#import "Singleton.h"

@implementation Singleton

+ (instancetype) shareInstance {
    static dispatch_once_t dispatch = 0;
    static Singleton * instance;
    dispatch_once(&dispatch,^{
        instance = [[Singleton hiddenAlloc] init];
    });
    return instance;
}

+ (instancetype)alloc {
    return [self shareInstance];
}

+ (instancetype)hiddenAlloc {
    return [super alloc];
}

@end

Swift 实现单例


基本思路:
利用static创建静态变量,然后把初始化器隐藏起来。

class Custom {
    // MARK: - Singleton Class

    static var shared = Custom()

    private override init() {
        super.init()
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值