В последнее время, работая с Objective-C и различными написанными в нем библиотеками, я заметил два действительно популярных одноэлементных паттерна. Одна версия извлекает экземпляр singleton и вызывает его методы экземпляра, а другая версия предоставляет только методы класса и никогда не дает вам экземпляр для работы. Все имеют целью абстрагировать доступ к одному ресурсу (StoreKit, CoreData, Parse API и т.д.). Например, здесь используется прежний подход, используемый в MKStoreKit:
// initialize singleton during app boot
[MKStoreManager sharedManager]
// sometime later in the app
[[MKStoreManager sharedManager] buyFeature:kFeatureAId
onComplete:^(NSString* purchasedFeature)
{
NSLog(@"Purchased: %@", purchasedFeature);
}
onCancelled:^
{
NSLog(@"User Cancelled Transaction");
}];
или, альтернативно, NSUserDefaults, UIApplication и т.д. Другой подход можно увидеть в MagicalRecord или здесь с Parse API:
// configure API credentials sometime during app boot
[Parse setApplicationId:@"123456"
clientKey:@"123456"];
// sometime later
PFObject *testObject = [PFObject objectWithClassName:@"TestObject"];
[testObject setObject:@"bar" forKey:@"foo"];
[testObject save];
Каковы некоторые плюсы и минусы двух подходов и одна из них принципиально лучше, чем другая?
Не нужно извлекать общий экземпляр, чтобы сохранить какое-либо свойство экрана (разница в производительности, скорее всего, не имеет значения), но могу ли я покрутить себя каким-то другим способом, например, с возможностью проверки?
Спасибо!