最近在使用 Objective-C 和用它编写的各种库时,我注意到两种非常流行的单例模式。一个版本获取单例实例并调用它的实例方法,而另一个版本只公开类方法,从不给你一个实例来使用。所有这些都具有抽象对单个资源(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];
这两种方法有哪些优缺点,其中一种从根本上优于另一种吗?
不必检索共享实例可以节省一些屏幕空间(性能差异可能无关紧要),但我是否以其他方式搞砸了自己,例如可测试性?
谢谢!