Wzorce projektowe: Singleton w Objective-C

Dziś kolej na Singleton w Objective-C. Poprzednio (w tym poście) pokazałem sposób na ten wzorzec napisany w języku Swift.

Opis wzorcahttp://pl.wikipedia.org/wiki/Singleton_(wzorzec_projektowy)

Podobnie jak w przypadku Swift pokażę przykład z licznikiem instancji. Poniżej zawartość pliku Singleton.h.

//  Singleton.h
//  Singleton
 
#import <Foundation/Foundation.h>
 
@interface Singleton : NSObject
 
@property (nonatomic) int counter;
 
+ (Singleton*)sharedInstance;
 
- (void)showCounter;
 
@end

A teraz kolej na plik Singleton.m :

//  Singleton.m
//  Singleton
 
#import "Singleton.h"
 
@implementation Singleton
 
@synthesize counter;
 
- (id)init {
    self = [super init];
    if(self) {
        counter++;
        NSLog(@"Singleton init, counter: %d", counter);
    }
    return self;
}
 
+ (Singleton*)sharedInstance {
    static Singleton* instance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[Singleton alloc] init];
    });
    return instance;
}
 
- (void)showCounter {
    NSLog(@"Show counter = %d", counter);
}
 
@end

Użyjmy zatem klasy Singleton w jakimś kontrolerze:

...
NSLog(@"Getting first instance");
Singleton* s1 = [Singleton sharedInstance];
[s1 showCounter];
 
NSLog(@"Getting second instance");
Singleton* s2 = [Singleton sharedInstance];
[s2 showCounter];
 
NSLog(@"Getting third instance");
Singleton* s3 = [Singleton sharedInstance];
[s3 showCounter];
...

Rezultat działania naszego programu w logach jest następujący:

2015-01-27 00:17:29.686 Singleton[89744:12673797] Singleton init, counter: 1
2015-01-27 00:17:29.687 Singleton[89744:12673797] Getting first instance
2015-01-27 00:17:29.687 Singleton[89744:12673797] Show counter = 1
2015-01-27 00:17:29.687 Singleton[89744:12673797] Getting second instance
2015-01-27 00:17:29.687 Singleton[89744:12673797] Show counter = 1
2015-01-27 00:17:29.687 Singleton[89744:12673797] Getting third instance
2015-01-27 00:17:29.687 Singleton[89744:12673797] Show counter = 1

Jak widać wszystko się zgadza 🙂


Projekt Xcode i pliki źródłowe z przykładowym kodem można znaleźć tutaj.


Ten post jest częścią cyklu o wzorcach projektowych w Objective-C i Swift. Strona Wzorce projektowe w Objective-C i Swift – Kompendium  zbiera w jednym miejscu wzorce i przypisane do nich artykuły. Zapraszam do lektury.

Dodaj komentarz