Ale*_*lin 39 oop design-patterns objective-c
虽然最近使用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");
}];
Run Code Online (Sandbox Code Playgroud)
或者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];
Run Code Online (Sandbox Code Playgroud)
这两种方法的优点和缺点是什么,其中一种基本上比另一种更好?
不必检索共享实例可以节省一些屏幕空间(性能差异可能无关紧要),但我是否以其他方式搞砸自己,例如,可测试性?
谢谢!
das*_*ght 29
基于类方法实现该方法有两种不同的方法:
第一个实现的含义是你可以用单例做的所有事情,你可以使用隐藏的单例:
如果你选择不使用单例的实现,你将依靠静态变量来保持当前状态.这是一个合理的选择,但是初始化模式变得不同(甚至可能使用a dispatch_once),你不能在不依赖于某些丑陋if条件的情况下在中间切换实现,并且使用子类会变得更加棘手.
测试第一个实现比测试第二个实现要容易一些,因为你可以通过后门提供单独的单例实现测试.使用基于静态的实现,不能使用此路由.
总而言之,我将使用基于单例的解决方案,单例可选地隐藏在提供单例方法访问的"外观"后面.我不会使用所有状态必须放在静态变量中的实现.
| 归档时间: |
|
| 查看次数: |
7315 次 |
| 最近记录: |