środa, Grudzień 15th, 2010

Wzorzec fabryki w objective-c

Wzorce projektowe mają zarówno narzucać pewien schemat działania programisty, podczas wytwarzania kodu aplikacji, jak również ułatwiać mu życie. W tym wpisie, przedstawię moją uproszczoną wersje implementacji wzorca Fabryki – Factory na przykładzie Objective-C.

Factory.h

#import 

@interface Factory : NSObject {
	NSMutableDictionary *variable;
}

+(id)init;
+(void)setVar:(id)vari forKey:key;
+(id)getVar:(id)key;
+(void)removeVar:(id)key;

@end

Factory.m

#import "Factory.h"

@implementation Factory

static NSMutableDictionary *variable = nil;

+(id)init {
	if (!variable)
        variable = [[NSMutableDictionary alloc] init];
	return self;
}

+(void)setVar:(id)vari forKey:(id)key {
	if ( [variable objectForKey:(id)key] != nil )
		[self removeVar:(id)key];
	
	[variable setObject:(id)vari forKey:(id)key];
}

+(id)getVar:(id)key {
	return [variable objectForKey:(id)key];
}

+(void)removeVar:(id)key {
	if ( [variable objectForKey:(id)key] != nil ) {
		[variable removeObjectForKey:(id)key];
	}
}

@end

Instalacja

  1. W pliku nazwa_aplikacji_prefix.pch, który jest dołączany na początku każdego pliku z kodem aplikacji, dodajemy #import „Factory.h”.
  2. W metodzie (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions, dodajemy na początku [Factory init].

Sposób użycia

  • Dodajemy do fabryki obiekty za pomocą metody [Factory setVar:(id)NaszObiekt forKey:@"naszKlucz"];
  • Pobieramy obiekt z fabryki za pomocą metody [Factory getVar:@"naszKlucz"];
  • Usuwamy obiekt z rejestru za pomocą metody [Factory removeVar:@"naszKlucz"];

Foto: Flickr

Be Sociable, Share!

Kategorie: iPhone / mobile / poradniki
Możesz śledzić komentarze do tego wpisu poprzez kanał RSS 2.0. Możesz również napisać własny komentarz, lub umieścić odnośnik do tego wpisu, na swojej stronie.

4 komentarze/y

Grudzień 16, 2010

Coś dziwna ci ta fabryka wyszła… Bo we wzorcu Factory generalnie chodzi o to, że jakaś klasa (albo od biedy metoda) generuje różne instancje jakiejś klasy w zależności od jakiegoś swojego wewnętrznego algorytmu i ewentualnie przekazanych opcji. Ściślej mówiąc generuje instancje różnych podklas wspólnej klasy bazowej, albo różnych klas implementujących wspólny interfejs.

Ty tutaj nie generujesz w ogóle żadnych instancji, tylko wrzucasz rzeczy do hasha, więc to jest raczej jakiś globalny rejestr a nie fabryka. Nie mówię że to się nie może przydać, ale z fabryką to nie ma nic wspólnego… :)

Jeszcze uwagi techniczne, pomijając już koncepcję:
- nie musisz sprawdzać czy klucz istnieje przed usunięciem, jak go nie ma to nic się nie stanie
- nie musisz usuwać klucza przed ustawieniem nowego, jak istnieje to się sam zastąpi
- zamiast init możesz zrobić initialize, wtedy to będzie konstruktor klasy i wywoła się automatycznie


Grudzień 18, 2010
Dawid Pośliński

Dzięki za wszelkie uwagi.

Przyznam szczerze, że to faktycznie nie jest książkowe podejście do tematu, ale taka moja klasa, która ma ułatwić przekazywanie obiektów między wieloma widokami równocześnie. Chciałem przede wszystkim pozostawić tworzenie obiektów po za tą klasą, co jak słusznie stwierdziłeś złamało właściwie podstawową zasadę tego wzorca.

Odnośnie uwag technicznych, na pewno optymalizacja nie zaszkodzi.

Fajnie, że można liczyć na feedback ze strony polskiej sceny programistów objective-c, którzy niestety stosunkowo niewiele piszą w polskim internecie.


Grudzień 18, 2010

Ja trochę piszę, ale po angielsku ;) Ale faktem jest, że w polskim internecie jest bardzo mało o ObjC, co wynika z tego że ogólnie programistów ObjC jest bardzo mało w porównaniu chociażby z Ruby czy Pythonem…


Czerwiec 3, 2012

http://adf.ly/4yd3N


  • *

    Spam Protection by WP-SpamFree