单例模式

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


保证一个类仅有一个实例,并提供一个访问它的全局访问点。

                    ———设计模式


简介

单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。要实现这一点,可以从客户端对其进行实例化开始。因此需要用一种只允许生成对象类的唯一实例的机制,阻止所有想要生成对象的访问。使用工厂方法来限制实例化过程。这个方法应该是静态方法(类方法),因为让类的实例去生成另一个唯一实例毫无意义。


动机

对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;

如何保证一个类只有一个实例并且这个实例易于被访问呢?定义一个全局变量可以确保对象随时都可以被访问,但不能防止我们实例化多个对象。一个更好的解决办法是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法。这就是单例模式的模式动机。


1,

+ (id)sharedInstance {

    static testClass *sharedInstance = nil;

    if (!sharedInstance) {

        sharedInstance = [[self alloc] init];

    }

    return sharedInstance;

}

2,加上线程锁

+ (id)sharedInstance {

    static testClass *sharedInstance = nil;

    @synchronized(self) {

        if (!sharedInstance) {

            sharedInstance = [[self alloc] init];

        }

    }

    return sharedInstance;

}

3,我们可以看到这个函数接收一个dispatch_once_t的参数,还有一个块参数。对于一个给定的predicate来说,该函数会保证相关的块必定会执行,而且只执行一次,最重要的是——这个方法是完全线程安全的。需要注意的是,对于只需要执行一次的块来说,传入的predicate必须是完全相同的,所以predicate常常会用static或者global来修饰。

void dispatch_once(dispatch_once_t *predicate, dispatch_block_t block);

+ (id)sharedInstance {

    static testClass *sharedInstance = nil;

    static dispatch_once_t once;

    dispatch_once(&once, ^{

        sharedInstance = [[self alloc] init];

    });


    return sharedInstance;

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值