Single Pattern(シングルモード)

14968 ワード

単例モードは一般的なソフトウェア設計モードである.単一のインスタンスモードにより、システム内の1つのクラスに1つのインスタンスしかなく、外部からのアクセスが容易であることを保証し、インスタンスの個数の制御を容易にし、システムリソースを節約することができる.システム内のクラスのインスタンスが1つしか存在しない場合は、単一のモードが最善の解決策です. 
iPhone SDKでは、次のようなパターンが使用されています.
[UIApplication sharedApplication]は、アプリケーションを表す単一のオブジェクトへのポインタを返します.[UIdevice currentDevice]は、使用するハードウェアプラットフォームを表すオブジェクトを取得します.
 
クラスメソッドを単一のインスタンスと組み合わせると、オブジェクトへのポインタを使用したり、インスタンス変数を保存したりすることなく、プログラムの任意の場所でオブジェクトメソッドによって単一のインスタンスを取得できます.例を挙げます.
main.m
 1 //
 2 //  main.m
 3 //  OCSinglePattern(    )
 4 //
 5 //  Created by     on 15/5/15.
 6 //  Copyright (c) 2015  Kenmu. All rights reserved.
 7 //
 8 
 9 #import <Foundation/Foundation.h>
10 #import "SinglePatternClass.h"
11 #import "SinglePatternClass2.h"
12 
13 int main(int argc, const char * argv[]) {
14     @autoreleasepool {
15         NSLog(@"          ");
16         SinglePatternClass *objA = [SinglePatternClass defaultSinglePatternClass];
17         objA.name = @"Kenmu     ";
18         NSLog(@"objA.name=%@", objA.name); //objA.name=Kenmu     
19         SinglePatternClass *objB = [SinglePatternClass defaultSinglePatternClass];
20         NSLog(@"objB.name=%@", objB.name); //objB.name=Kenmu     
21         objB.name = @"Kenmu     ,  objB.name, objA.name       ";
22         NSLog(@"      %@", [objB.name isEqualToString:objA.name] ? @"  " : @"  "); //        
23         
24         NSLog(@"

GCD
"); 25 SinglePatternClass2 *objC = [SinglePatternClass2 sharedSinglePatternClass2]; 26 objC.name = @"Kenmu "; 27 NSLog(@"objC.name=%@", objC.name); //objC.name=Kenmu 28 SinglePatternClass2 *objD = [SinglePatternClass2 sharedSinglePatternClass2]; 29 NSLog(@"objD.name=%@", objD.name); //objD.name=Kenmu 30 objB.name = @"Kenmu , objD.name, objC.name "; 31 NSLog(@" %@", [objD.name isEqualToString:objC.name] ? @" " : @" "); // 32 } 33 return 0; 34 }

 
SinglePatternClass.h
 1 #import <Foundation/Foundation.h>
 2 
 3 @interface SinglePatternClass : NSObject
 4 @property (strong, nonatomic) NSString *name;
 5 
 6 /**
 7  *            
 8  *
 9  *  @return SinglePatternClass  
10  */
11 + (SinglePatternClass *)defaultSinglePatternClass;
12 @end

 
SinglePatternClass.m
 1 #import "SinglePatternClass.h"
 2 
 3 static SinglePatternClass *singleObj = nil;
 4 @implementation SinglePatternClass
 5 + (SinglePatternClass *)defaultSinglePatternClass {
 6     @synchronized(self) { //   @synchronized   ,             ;  :NSLock C   pthread_mutex_t、GCD dispatch_semaphore_t(   )
 7         if (!singleObj) {
 8             singleObj = [[SinglePatternClass alloc] init]; //  alloc     allocWithZone:  
 9         }
10         return singleObj;
11     }
12 }
13 
14 + (id)allocWithZone:(struct _NSZone *)zone {
15     @synchronized(self) {
16         if (!singleObj) {
17             singleObj = [super allocWithZone:zone];
18             return singleObj;
19         }
20     }
21     return nil;
22 }
23 @end

 
SinglePatternClass2.h  
 1 #import <Foundation/Foundation.h>
 2 
 3 @interface SinglePatternClass2 : NSObject
 4 @property (strong, nonatomic) NSString *name;
 5 
 6 /**
 7  *  GCD      
 8  *
 9  *  @return SinglePatternClass2  
10  */
11 + (SinglePatternClass2 *)sharedSinglePatternClass2;
12 @end

 
SinglePatternClass2.m
 1 #import "SinglePatternClass2.h"
 2 
 3 @implementation SinglePatternClass2
 4 + (SinglePatternClass2 *)sharedSinglePatternClass2 {
 5     static SinglePatternClass2 *singleObj2;
 6     
 7     static dispatch_once_t onceToken;
 8     dispatch_once(&onceToken, ^{ //     &onceToken                 ,                。dispatch_once              ,         
 9         singleObj2 = [[SinglePatternClass2 alloc] init];
10     });
11     return singleObj2;
12 }
13 @end

 
コードの説明:
1、synchronizedこれは主にマルチスレッドを考慮したプログラムであり、この命令は{}内のコードを1つのスレッドに制限して実行することができ、あるスレッドが実行されていない場合、他のスレッドは実行が必要であれば待たなければならない. 
2、allocWithZoneこれはリロードされています.これは、作成されたメモリ領域から情報を読み出してオブジェクトインスタンスを作成するため、必要なオブジェクトインスタンスがすでに存在する場合は、現在のオブジェクトインスタンスの変更を禁止する必要があるため、nilに戻ります.