Categories
Non classé

Singleton

Le Singleton est sans doute la Design Pattern la plus connue, ne serait-ce parce qu’elle est simple à comprendre. L’idée est que certains objets n’existent qu’à un seul exemplaire dans une application. Considérez par exemple ces méthodes de classes Cocoa:

  • +[NSFileManager defaultManager]
  • +[NSFontPanel sharedFontPanel]
  • +[NSApplication sharedApplication]

Chacune renvoie un objet partagé — une instance unique pour toute l’application. Il faut appeler cette méthode de classe pour accéder à cet objet, et ne pas instancier un objet comme on le fait d’habitude, avec le couple [[alloc] init].

Le Singleton: Version simple

Créer un objet singleton en Objective-C n’est pas compliqué:

Pour le .h:

@interface MonSingleton: NSObject { } 

+ (MonSingleton *) sharedSingleton; 

@end

Pour le .m:

@implementation
static MonSingleton *sharedSingletonInstance = nil; 

- (id) init 
{ 
 if(self = [super init]) 
 {
 // Initialisations classiques 
 } 
 return self; 
} 

+ (MonSingleton *) sharedSingleton
{ 
 if(sharedSingletonInstance == nil) // Pas encore instancié
 sharedSingletonInstance = [[MonSingleton alloc] init]; 

 return sharedSingleton; 
} 

@end

 

Le Singleton: Version Apple

Voici l’implémentation proposée par Apple :

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

La différence est que les méthodes en rapport avec la création, la copie et la destructions des instances sont supplantées pour vous empêcher de créer une instance supplémentaire , ou de détruire l’instance partagée. Il s’agit d’une approche plus paranoïaque que celle que je vous proposais plus haut. Je dirais qu’elle convient mieux si vous travaillez en équipe ou que vous rendez publique votre bibliothèque de classes. La première version possède l’avantage de la simplicité, et convient pour un petit projet, par exemple sur iPhone.