【问题标题】:Should we create more than one object for a singleton class? is this fine for singleton design pattern [duplicate]我们应该为一个单例类创建多个对象吗?这对单例设计模式好吗[重复]
【发布时间】:2013-10-29 13:54:00
【问题描述】:

我创建了一个单例类,这里是代码

static DPGameManager *sharedManager = nil;  
+ (DPGameManager *)sharedManager  
{  
    static dispatch_once_t singletonPredicate;  
    dispatch_once (&_singletonPredicate, ^(){  
             sharedManager = [[DPGameManager alloc]init];  
});  
return sharedManager;  
}

DPGameManager *m1 = [DPGameManager sharedManager];  
DPGameManager *m2 = [DPGameManager alloc]init];  
DPGameManager *m3 = [DPGameManager alloc]init];  

m1、m2、m3 是三个不同的对象。
但是我们应该不能为一个单例类创建三个不同的对象。
我们怎样才能做到这一点。?
或者这是否可以为 Singleton 类创建不同的对象。

【问题讨论】:

  • 在单例模式的良好实现中,init 不会创建 3 个不同的实例,但应该给您相同的实例,只在第一次创建一个新实例。您需要实现自己的 init 方法(以及所有其他 init 方法)以确保该类只有一个实例
  • @MarcoPace 谢谢...我得到了我的一个问题的答案,即单身人士应该创建一个且只有一个对象。但是,您能否提供一些代码,在单例类的情况下实现自己的 init 方法。
  • @RajanKumarTiwari 我发现 Mugunth Kumar 的 this singleton template 在很多时候都很有用。
  • 您不必显式分配单例:+ (DPGameManager *)sharedManager 在第一次调用时就这样做了。您可以(并且可能应该 - 为了避免混淆)始终将 is 称为 [DPGameManager sharedManager],您就可以开始了。

标签: ios objective-c singleton


【解决方案1】:

首先:单例是一个类,你可以创建一个并且只能创建一个实例对象。这是通常的定义,也是 Apple 使用的定义。但是,有趣的是,在同一个文档中,示例包含一些案例,在这些案例中,该规则得到满足。 (即 NSFileManager IIRC。)因此,在 Apple 看来,即使存在差异,共享实例和单例之间也没有太大区别。 (共享实例是“特殊实例”,单例是孤独的牛仔。)

所以——也许——采用这种“共享实例是单例,即使它们不是”反模式就足够了。我不会那样做的。但是,当他找到一个名为 +sharedInstance 的方法时,可能没有人会想到 +alloc。所以——也许再一次——这没什么大不了的。

虽然使用手动 RC 采用单例模式很容易,但使用自动 RC 就有点困难了。我认为最简单的方法是在 -init... 中返回 sharedInstance,如 cmets 中所述。 -init… 方法是所有权消耗和所有权转移。 (Apple 的文档中没有提到这一点。您应该始终阅读有关此主题的 clang 文档。到目前为止它们更好。)因此 +alloc 提供的旧实例将被消耗并移走。

【讨论】:

  • [NSFileManager defaultManager] 是一个可以轻松用于多种用途的单例。 [[NSFileManager alloc] init] 故意不是单例。当您需要在使用之前修改 NSFileManager 对象时可以使用它,这不适用于具有单例的多个线程。
  • 根据定义,单例类只有一个实例对象。根据 wiki 的定义(“是一种将类的实例化限制为一个对象的设计模式。”),根据 Apple 的定义(“而对于单例类,只能有 一个实例 每个进程的类。”)这个世界上可能没有人声明一个 instance 来采用单例模式。类采用单例模式。请阅读文档。
  • 嗯,这是 Objective-C,我们采取务实的方法。
  • 这样做没有错。但是混淆事物并使用错误的术语是错误的。这不务实。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-23
  • 1970-01-01
  • 2010-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多