{"id":16,"date":"2010-06-04T09:33:00","date_gmt":"2010-06-04T09:33:00","guid":{"rendered":"http:\/\/www.renaudpradenc.com\/?p=16"},"modified":"2013-01-17T15:51:11","modified_gmt":"2013-01-17T14:51:11","slug":"singleton","status":"publish","type":"post","link":"https:\/\/www.renaudpradenc.com\/?p=16","title":{"rendered":"Singleton"},"content":{"rendered":"<p>Le Singleton est sans doute la Design Pattern la plus connue, ne serait-ce parce qu&#8217;elle est simple \u00e0 comprendre. L&#8217;id\u00e9e est que certains objets n&#8217;existent qu&#8217;\u00e0 un seul exemplaire dans une application.\u00a0Consid\u00e9rez par exemple ces m\u00e9thodes de classes Cocoa:<\/p>\n<ul>\n<li>+[NSFileManager defaultManager]<\/li>\n<li>+[NSFontPanel sharedFontPanel]<\/li>\n<li>+[NSApplication sharedApplication]<\/li>\n<\/ul>\n<p>Chacune renvoie un objet partag\u00e9 \u2014 une instance unique pour toute l&#8217;application. Il faut appeler cette m\u00e9thode de classe pour acc\u00e9der \u00e0 cet objet, et ne pas instancier un objet comme on le fait d&#8217;habitude, avec le couple [[alloc] init].<\/p>\n<h1>Le Singleton: Version simple<\/h1>\n<p>Cr\u00e9er un objet singleton en Objective-C n&#8217;est pas compliqu\u00e9:<\/p>\n<p>Pour le .h:<\/p>\n<pre>@interface MonSingleton: NSObject { } \r\n\r\n+ (MonSingleton *) sharedSingleton; \r\n\r\n@end<\/pre>\n<p>Pour le .m:<\/p>\n<pre>@implementation\r\nstatic MonSingleton *sharedSingletonInstance = nil; \r\n\r\n- (id) init \r\n{ \r\n if(self = [super init]) \r\n {\r\n \/\/ Initialisations classiques \r\n } \r\n return self; \r\n} \r\n\r\n+ (MonSingleton *) sharedSingleton\r\n{ \r\n if(sharedSingletonInstance == nil) \/\/ Pas encore instanci\u00e9\r\n sharedSingletonInstance = [[MonSingleton alloc] init]; \r\n\r\n return sharedSingleton; \r\n} \r\n\r\n@end<\/pre>\n<p>&nbsp;<\/p>\n<h1>Le Singleton: Version Apple<\/h1>\n<p>Voici l&#8217;impl\u00e9mentation <a href=\"http:\/\/developer.apple.com\/mac\/library\/documentation\/Cocoa\/Conceptual\/CocoaFundamentals\/CocoaObjects\/CocoaObjects.html#\/\/apple_ref\/doc\/uid\/TP40002974-CH4-SW32\">propos\u00e9e par Apple<\/a>\u00a0:<\/p>\n<pre>static MyGizmoClass *sharedGizmoManager = nil;\r\n\r\n+ (MyGizmoClass*)sharedManager\r\n{ \r\n if (sharedGizmoManager == nil)\r\n {\r\n sharedGizmoManager = [[super allocWithZone:NULL] init]; \r\n }\r\n return sharedGizmoManager;\r\n} \r\n\r\n+ (id)allocWithZone:(NSZone *)zone\r\n{\r\n return [[self sharedManager] retain];\r\n}\r\n\r\n- (id)copyWithZone:(NSZone *)zone\r\n{\r\n return self;\r\n}\r\n\r\n- (id)retain {\r\n return self;\r\n}\r\n\r\n- (NSUInteger)retainCount\r\n{\r\n return NSUIntegerMax; \/\/denotes an object that cannot be released\r\n}\r\n\r\n- (void)release\r\n{\r\n \/\/do nothing\r\n}\r\n\r\n- (id)autorelease\r\n{\r\n return self;\r\n}<\/pre>\n<p>La diff\u00e9rence est que les m\u00e9thodes en rapport avec la cr\u00e9ation, la copie et la destructions des instances sont supplant\u00e9es pour vous emp\u00eacher de cr\u00e9er une instance suppl\u00e9mentaire , ou de d\u00e9truire l&#8217;instance partag\u00e9e. Il s&#8217;agit d&#8217;une approche plus parano\u00efaque que celle que je vous proposais plus haut. Je dirais qu&#8217;elle convient mieux si vous travaillez en \u00e9quipe ou que vous rendez publique votre biblioth\u00e8que de classes. La premi\u00e8re version poss\u00e8de l&#8217;avantage de la simplicit\u00e9, et convient pour un petit projet, par exemple sur iPhone.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Le Singleton est sans doute la Design Pattern la plus connue, ne serait-ce parce qu&#8217;elle est simple \u00e0 comprendre. L&#8217;id\u00e9e est que certains objets n&#8217;existent qu&#8217;\u00e0 un seul exemplaire dans une application.\u00a0Consid\u00e9rez par exemple ces m\u00e9thodes de classes Cocoa: +[NSFileManager defaultManager] +[NSFontPanel sharedFontPanel] +[NSApplication sharedApplication] Chacune renvoie un objet partag\u00e9 \u2014 une instance unique pour [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[85,77],"class_list":["post-16","post","type-post","status-publish","format-standard","hentry","category-uncategorized","tag-objective-c","tag-singleton"],"_links":{"self":[{"href":"https:\/\/www.renaudpradenc.com\/index.php?rest_route=\/wp\/v2\/posts\/16","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.renaudpradenc.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.renaudpradenc.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.renaudpradenc.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.renaudpradenc.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=16"}],"version-history":[{"count":6,"href":"https:\/\/www.renaudpradenc.com\/index.php?rest_route=\/wp\/v2\/posts\/16\/revisions"}],"predecessor-version":[{"id":360,"href":"https:\/\/www.renaudpradenc.com\/index.php?rest_route=\/wp\/v2\/posts\/16\/revisions\/360"}],"wp:attachment":[{"href":"https:\/\/www.renaudpradenc.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=16"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.renaudpradenc.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=16"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.renaudpradenc.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=16"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}