单身设计模式和不同类型之间的差异?

时间:2017-11-08 09:07:54

标签: ios objective-c design-patterns singleton nsoperationqueue

有不同类型的单例实现。

首先:

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;
}

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

1 个答案:

答案 0 :(得分:1)

我担心我不能给你一个可以清楚解释这三种方式的链接,但我会告诉你我的理解。

  • 第一种方式:您创建实例是MyGlobalClass类的静态变量。在myinstance方法中,您可以检查instance是否已初始化。如果没有,请初始化instance。毕竟,返回instance的值。因为instance是MyGlobalClass的静态变量,所以当你调用[MyGlobalClass myinstance]时,它总是一个对象。
  • 第二种方式:您创建 shaedInstance是方法sharedInstance的静态变量。当你调用dispatch_once(&onceToken时,块内的代码只被调用一次。关于dispatch_once,您可以查看here。因为初始化方法只被调用一次,所以当你返回它时,shaedInstance总是一个对象。实际上,如果shaedInstance是PKShareClass类的静态变量,则没有区别。您可以使用两种方式。
  • 第三种方式:在我解释第二种方式后你可以理解。当shaedInstancePKShareClass类的静态变量时,这种方式与第二种方式相同。但您无需在!_connectionQueue内查看dispatch_once。因为它只运行一次,而且在第一次总是nil。这种方式可以重构:

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

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