Singleton实例VS类方法(Singleton Instance vs Class Metho

2019-07-03 12:17发布

虽然最近与Objective-C和写在它的各种库的工作,我已经注意到2种非常受欢迎的单模式。 一个版本获取单个实例,并调用它的实例方法和其他版本只公开类的方法,从不给你一个实例一起工作。 所有具有抽象访问单个资源(StoreKit,CoreData,解析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];

什么是两种方法的优点和缺点,是他们中的一个从根本上优于其他?

不必检索共享实例节省一些屏幕房地产(性能差异可能是无关紧要的),但我在自己拧在一些其他的方式,例如,可测试性,是否明智?

谢谢!

Answer 1:

有基于类的方法来实现这个方法两种不同的方式:

  • 利用大家隐藏的一类做单一实例,以及隐藏其背后的包装类方法具有相同签名的方法,或
  • 制作类方法是做好一切工作

第一个实现的含义是,一切都可以用一个单独做,你可以隐藏单做:

  • 使用亚类成为可能
  • 在运行的中间切换的情况下很容易
  • 国家生活实例变量
  • 初始化遵循熟悉的模式

如果你去不使用一个单独的实现,你会依靠静态变量,让您的当前状态。 这是一个合理的选择,但(甚至使用初始化模式变得不同dispatch_once ),你不能切换中间的实现不依赖于有些难看if条件,并使用一个子类成为了很多棘手。

测试的第一个实现比测试第二个,因为你可以提供一个单独的执行单进行测试,可能通过后门比较容易; 与基于静态的实现,这条路不能服用。

总之,我会用一个基于单的解决方案,具有可选的背后隐藏着的是提供了访问单的方法“门面”的单身。 我不会用,所有国家必须放在静态变量的实现。



Answer 2:

单身方法的一个优点是,它变得微不足道,让其他情况下,如果你需要。 如果你把类方法的办法,这就是你得到没有大量的重构。



文章来源: Singleton Instance vs Class Methods