To całkiem proste pytanie. Ignorowanie konsekwencji nadmiernego użycia wzorca singleton. Próbuję znaleźć wiarygodne tupot singletonu w Objective-C. Mam natknąć się następująco:Static Class vs Singleton
@implementation SomeSingleTonClass
static SomeSingleTonClass* singleInstance;
+ (SomeSingleTonClass*)getInstance
{
static dispatch_once_t dispatchOnceToken;
dispatch_once(&dispatchOnceToken, ^{
singleInstance = [[SomeSingleTonClass alloc] init];
});
return singleInstance;
}
- (void)someMethodOnTheInstance
{
NSLog(@"DO SOMET WORK")
}
@end
to jestem dość zadowolony, ale to prowadzi do wielu następująco:
[[SomeSingleTonClass getInstance] someMethodOnTheInstance];
Moje pytanie brzmi, dlaczego jest to lepsze niż klasy czysto statycznym.
@implementation SomeStaticClass
static NSString* someStaticStateVariable;
- (id)init
{
//Don't allow init to initialize any memory state
//Perhaps throw an exception to let some other programmer know
//not to do this
return nil;
}
+ (void)someStaticMethod
{
NSLog(@"Do Some Work");
}
Wszystko, co naprawdę zyskujesz, to łagodnie czystsze metody wywoływania metod. Zasadniczo zamienić się w ten sposób:
[[SomeSingleTonClass getInstance] someMethodOnTheInstance];
Z tego
[SomeStaticClass someStaticMethod];
To drobne uproszczenie na pewno, i zawsze można przechowywać wewnątrz instancji klasy. To jest bardziej intelektualna ciekawość, jaki bóg Objective-C wkurza mnie za pomocą klas statycznych zamiast singletonów? Jestem pewien, że nie mogę być pierwszą osobą, która to wymyśli, ale obiecuję, że najpierw zrobiłem duplikat wyszukiwania. Kilka odpowiedzi, które znalazłem, miałem wrażenie, że były oparte na starszych wersjach kakao, ponieważ nawet omawiane wzorce singletonowe wydawały się mieć problemy z wątkami.
Myślę, że masz rację, ale to pytanie jest nieco zawiłe (choć odpowiedź jest solidna!). Mam zamiar opuścić moje, ale biorąc pod uwagę odpowiedzi w tym wątku, nie muszę czekać na awanse na odpowiedź Drummera. Jest prawidłowe. Dzięki! – ChrisCM
Co to jest klasa statyczna? – Monolo
Klasa statyczna (prawdopodobnie jest to lepsza nazwa) jest klasą, która opiera się na metodach klasy i statycznych zmiennych klasowych, a nie instancjonowanych metodach obiektów i instancji. To sprawia, że jest to wygodny singleton. Zwłaszcza jeśli zakodujesz metodę init, aby rzucić wyjątek! – ChrisCM