单例设计模式和不同类型之间的区别?
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是PKShareClass
class的静态变量也没什么区别。您可以使用这两种方式。
第三种方式:第二种方式我解释完你就明白了。当shaedInstance
是PKShareClass
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 种方式 ;)
有不同类型的单例实现。
第一个:
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是PKShareClass
class的静态变量也没什么区别。您可以使用这两种方式。 第三种方式:第二种方式我解释完你就明白了。当
shaedInstance
是PKShareClass
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 种方式 ;)