最近,在使用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");
}];
或者,应用程序默认值等..另一种方法可以在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];
这两种方法的优缺点是什么?其中一种方法从根本上优于另一种方法吗?
不必检索共享实例可以节省一些屏幕空间(性能差异可能无关紧要),但我是否在其他方面搞砸了自己,例如,可测试性方面?
谢谢