我查看了GNUStep的NSNumber实现的源代码,以了解工厂方法实现在那里的工作原理。
从那里我可以理解的是,我们的NSNumber具有所有initWithXYZ方法的空白实现。 NSTemporaryNumber就像层次结构中的一个中间类,它实现了所有initWithXYZ方法,它实际上创建了特定类型的对象,自动释放自身并返回创建的对象。
还重写了allocWithZone以避免创建NSNumber对象并创建NSTemporaryNumber的对象(如果是这样的话),否则创建特定类型的对象。
我不明白的是,NSNumber本身不能做同样的事情吗? 为什么要给出空白实现,创建特定类型的对象,然后自动释放自己。
另外如果我们在NSNumber本身中有createXYZ方法的实现,为什么还有initWithXYZ方法呢?
如果我必须为我的项目实现一个工厂实现,那里说我有两个mediaItems,视频,音频和照片等。 为此我有单独的类和相应的枚举,我传递给initWithMediaType谁将创建一个正确的子类的对象,返回并销毁自己。
有两个类,如NSNumber和NSTemporaryNumber:说Media和TemporaryMedia,其中一个是空白实现,其他实现如上所述?
我应该这样做吗? 这是我们在Objective C中实现Factory模式的方式吗?
我的问题可能看起来很愚蠢我来自Java,C ++背景,事情看起来不同。 目的可能是相同的,但我发现很难理解Objective C的方式,因为它没有抽象类。
链接到来源: http://www.koders.com/objectivec/fid46956186C20201706AFE1744AA7AFEEE09D1FE5A.aspx
答案 0 :(得分:1)
关键是NSNumber
是一个类集群。您实际上最终的课程可能是NSIntNumber
,NSFloatNumber
或其他几个课程。它们都响应与NSNumber
相同的消息(并且,通常在此模式中将是它的子类,但这不是必需的)因此它对调用者没有任何实际区别。
当你调用alloc
时,无法知道要创建什么类型的对象,因此创建并返回中性类型。在收到适当的init
后,它会适当替换。
所以这个模式是用于类集群的实现。如果编写一个只提供自身实例的类,则可以忽略它。