单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,并且自行实例化并向整个系统提供这个实例。这个类称为单例类。html
1.单例模式的要点:app
显然单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行建立这个实例;三是它必须自行向整个系统提供这个实例。ide
2.单例模式的优势:post
static SingletonManage* sharedInstance = nil; + (SingletonManage *)instance { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedInstance = [[super alloc]init]; }); return sharedInstance; } + (id)allocWithZone:(NSZone *)zone { NSLog(@"You need to use instance class method instead!"); return nil; }
Some classes of the Foundation and AppKit frameworks create singleton objects. In a strict implementation, a singleton is the sole allowable instance of a class in the current process. But you can also have a more flexible singleton implementation in which a factory method always returns the same instance, but you can allocate and initialize additional instances.The NSFileManager
class fits this latter pattern, whereas the UIApplication
fits the former. When you ask for an instance of UIApplication
, it passes you a reference to the sole instance, allocating and initializing it if it doesn’t yet exist. flex
A singleton object acts as a kind of control center, directing or coordinating the services of the class. Your class should generate a singleton instance rather than multiple instances when there is conceptually only one instance (as with, for example, NSWorkspace
). You use singleton instances rather than factory methods or functions when it is conceivable that there might be multiple instances someday. ui
To create a singleton as the sole allowable instance of a class in the current process, you need to have an implementation similar to Listing 2-15. This code does the following:this
It declares a static instance of your singleton object and initializes it to nil
.spa
In your class factory method for the class (named something like “sharedInstance” or “sharedManager”), it generates an instance of the class but only if the static instance is nil
.code
It overrides the allocWithZone:
method to ensure that another instance is not allocated if someone tries to allocate and initialize an instance of your class directly instead of using the class factory method. Instead, it just returns the shared object.orm
It implements the base protocol methods copyWithZone:
, release
, retain
, retainCount
, and autorelease
to do the appropriate things to ensure singleton status. (The last four of these methods apply to memory-managed code, not to garbage-collected code.)
Listing 2-15 Strict implementation of a singleton
static MyGizmoClass *sharedGizmoManager = nil; |
+ (MyGizmoClass*)sharedManager |
{ |
if (sharedGizmoManager == nil) { |
sharedGizmoManager = [[super allocWithZone:NULL] init]; |
} |
return sharedGizmoManager; |
} |
+ (id)allocWithZone:(NSZone *)zone |
{ |
return [[self sharedManager] retain]; |
} |
- (id)copyWithZone:(NSZone *)zone |
{ |
return self; |
} |
- (id)retain |
{ |
return self; |
} |
- (NSUInteger)retainCount |
{ |
return NSUIntegerMax; //denotes an object that cannot be released |
} |
- (void)release |
{ |
//do nothing |
} |
- (id)autorelease |
{ |
return self; |
} |
If you want a singleton instance (created and controlled by the class factory method) but also have the ability to create other instances as needed through allocation and initialization, do not override allocWithZone:
and the other methods following it as shown in Listing 2-15.