Cocoa单例和协议

5

我希望定义一个协议,并创建一种易于使用、标准的方式来获取该协议的“默认”共享实现-单例模式。Cocoa遵循以下模式:

[NSUserDefaults standardUserDefaults]
[NSNotificationCenter defaultCenter]

但无论哪种情况,它们都在对象层次结构的底部拥有@interfaces。我正在困扰如何使用@protocols完成此任务。显然,我可以创建一个具有空或简单方法实现的类 - 但实际上,我想要的是在层次结构底部的@protocol。我尝试了以下内容:

@protocol ConfigurationManager <NSObject>

//...

@interface ConfigurationManagerFactory : NSObject

+ (id<ConfigurationManager>)sharedConfiguration;

@end

// ...

id<ConfigurationManger> config = [ConfigurationManagerFactory sharedConfiguration];
[config ...];

目前我的方案是可行的,但我总是需要解释如何使用以及为什么要这样做。是否有一种方法可以符合Cocoa的语法(调用约定),同时仍然利用@protocols的价值?

另外,为什么我不想像这样使用@protocols呢?实现@interface仍然可以利用类别和替代实现,等等 - 就像实例化NSString通常会让你拥有扩展NSString的类一样。

2个回答

2
协议的整个意义在于它指定了一个接口,却没有提供具体实现。如果你需要一个默认的实现,那么就提供一个实现该协议的类,就像NSObject类实现了NSObject协议一样。这样客户端可以通过继承你提供的类或者通过实例化该类并使用生成的对象实现来使用它,例如你的config对象。

绝对的,我需要一个协议,因为我不想必须提供一个实现。我还需要一种方法来公开一个默认的、简单的或标准的实现作为单例,其语法与 Cocoa 的做法相一致(WWCD :) 我所缺少的是名称可以相同。你的 NSObject 示例正中要害 - 这正是我在寻找的!Jordão 直接了当地说出了这一点,但它让我达到了同样的目的。 - Luther Baker
1
为什么要使用单例模式?单例不仅仅是一个共享对象,它还是一个只能被实例化一次的类(参考:http://en.wikipedia.org/wiki/Singleton_pattern)。从我目前所了解的情况来看,你只是想要一种简单的方法来创建一个实现你的协议的对象。如果你愿意,你可以为此创建一个便捷方法,但是根据你所提供的信息,创建一个单例似乎是不必要的。我并不确定你是否需要一个共享对象。 - Caleb

2

这里有一个想法:创建一个与协议同名的类,并提供一个工厂方法,以返回协议的默认实现:

@protocol ConfigurationManager <NSObject> ...

@interface ConfigurationManager : NSObject <ConfigurationManager> 
+(ConfigurationManager *) defaultConfigurationManager;
...

其他专门的实现可以继承您的基类。


啊 - 我以为那会造成命名冲突!我想那正是我需要的!谢谢。 - Luther Baker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接