单例设计模式和不同类型之间的区别?

Singleton design patterns and Differences between different types?

有不同类型的单例实现。

第一个:

static MyGlobalClass *instance = nil;
+(MyGlobalClass*)myinstance
{
@synchronized(self)
{
    if(instance==nil)
    {
        instance= [MyGlobalClass new];
   }
}
return instance;
}

第二个:

+(PKShareClass *)sharedInstance
{
static PKShareClass *shaedInstance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    shaedInstance = [[PKShareClass alloc]init];
});

return shaedInstance;}

最后

static NSOperationQueue * _connectionQueue = nil;
+ (NSOperationQueue *) connectionQueue{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    if (!_connectionQueue)
    {
        _connectionQueue = [[NSOperationQueue alloc] init];

    }
});
return _connectionQueue;
}

这里我的问题是当我们像 first 和 second 这样初始化时意味着什么?? 第三个是 NSOperationQueue。我们像第三个一样初始化有什么用? 很难找到意思。

恐怕我不能给你一个link可以清楚地解释这三种方式,但我会告诉你我的理解。

  • 第一种方式:你创建的实例是MyGlobalClassclass的一个静态变量。在 myinstance 方法中,您检查 instance 是否已初始化。如果不是,则初始化instance。毕竟return值instance。因为 instance 是 MyGlobalClass 的静态变量,所以当你调用 [MyGlobalClass myinstance] 时,它总是一个对象。
  • 第二种方式:您创建shaedInstance 是方法sharedInstance 的静态变量。当您调用 dispatch_once(&onceToken 时,块内的代码仅被调用一次。关于dispatch_once,大家可以看看here。因为初始化方法只被调用一次,当你return它时shaedInstance总是一个对象。其实如果shaedInstance是PKShareClassclass的静态变量也没什么区别。您可以使用这两种方式。
  • 第三种方式:第二种方式我解释完你就明白了。当shaedInstancePKShareClass class 的静态变量时,这种方式与第二种方式相同。但是你不需要检查dispatch_once里面的!_connectionQueue。因为它只运行一次,而且第一次总是 nil。这种方式可以重构为:

    static NSOperationQueue * _connectionQueue = nil;
    
    + (NSOperationQueue *) connectionQueue{
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            if (!_connectionQueue)
            _connectionQueue = [[NSOperationQueue alloc] init];
        });
        return _connectionQueue;
     }
    

希望我的回答可以帮助您更轻松地理解 3 种方式 ;)