Single Pattern(シングルモード)
14968 ワード
単例モードは一般的なソフトウェア設計モードである.単一のインスタンスモードにより、システム内の1つのクラスに1つのインスタンスしかなく、外部からのアクセスが容易であることを保証し、インスタンスの個数の制御を容易にし、システムリソースを節約することができる.システム内のクラスのインスタンスが1つしか存在しない場合は、単一のモードが最善の解決策です.
iPhone SDKでは、次のようなパターンが使用されています.
[UIApplication sharedApplication]は、アプリケーションを表す単一のオブジェクトへのポインタを返します.[UIdevice currentDevice]は、使用するハードウェアプラットフォームを表すオブジェクトを取得します.
クラスメソッドを単一のインスタンスと組み合わせると、オブジェクトへのポインタを使用したり、インスタンス変数を保存したりすることなく、プログラムの任意の場所でオブジェクトメソッドによって単一のインスタンスを取得できます.例を挙げます.
main.m
SinglePatternClass.h
SinglePatternClass.m
SinglePatternClass2.h
SinglePatternClass2.m
コードの説明:
1、synchronizedこれは主にマルチスレッドを考慮したプログラムであり、この命令は{}内のコードを1つのスレッドに制限して実行することができ、あるスレッドが実行されていない場合、他のスレッドは実行が必要であれば待たなければならない.
2、allocWithZoneこれはリロードされています.これは、作成されたメモリ領域から情報を読み出してオブジェクトインスタンスを作成するため、必要なオブジェクトインスタンスがすでに存在する場合は、現在のオブジェクトインスタンスの変更を禁止する必要があるため、nilに戻ります.
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に戻ります.