2012-04-18 23 views
1

我浏览了GNUStep的NSNumber实现的源代码,以了解工厂方法实现在那里如何工作。为什么我们有NSNumber和NSTemporaryNumber作为两个不同的类?

从那里我能理解什么是我们的NSNumber空白实施所有initWithXYZ样的方法。而NSTemporaryNumber在层次结构中表现得像一个中间类,它实现了所有initWithXYZ方法,实际上它创建了特定类型的对象,自动释放自己并返回创建的对象。

而且allocWithZone是重写,以避免NSNumber的对象的创建和打造NSTemporaryNumber的对象,如果它是如此,否则创建特定类型的对象。

我不明白的是,不能在同一个东西被自己的NSNumber做? 为什么根本没有实现空白的实现,创建特定类型的对象,然后autorelease self。

此外,如果我们在自己的NSNumber方法createXYZ实现,为什么initWithXYZ方法呢?

如果我要实现我的项目在那里说,我有两个mediaItems,视频,音频和照片等 对此我有不同的类和相应的枚举,我传给谁initWithMediaType将创建的对象的工厂实现正确的孩子课堂,返回并摧毁自己。

有两个类喜欢的NSNumber和NSTemporaryNumber:说媒体和上述TemporaryMedia,一个与其他与实现空白的实现?

我应该这样做吗? 这是我们必须在目标C中实现工厂模式的方式吗?

我的问题可能有点傻biut我来自一个Java,C++背景里的东西看起来不同。 目的可能是相同的,但我发现难以理解Objective C的方式,因为它没有抽象类。

链接到源: http://www.koders.com/objectivec/fid46956186C20201706AFE1744AA7AFEEE09D1FE5A.aspx

回答

1

的一点是,NSNumber是一类集群。您实际上最终得到的课程可能是NSIntNumberNSFloatNumber或其他几个课程之一。他们都回应与NSNumber相同的消息(并且通常在这种模式下将是它的子类,但这不是必需的),因此它对调用者没有真正的区别。

当您致电alloc时,无法知道要创建什么类型的对象,因此创建并返回中性类型。在收到适当的init后,它会进行适当的替换。

所以这种模式是为了实现类集群。如果编写仅提供自身实例的类,则可以忽略它。

+0

非常感谢这个解释。 但我仍然有一个疑问。 Cant NSNumber的适当的init方法创建了正确的类的对象并销毁NSNumber实例,而不是首先创建一个NSTemporaryNumber并要求它做同样的事情? 也.. 我们也有一些'创造'的方法,他们是否实现抽象工厂模式? 以及这种方法的可用性,我们需要有一个类集群? – 2012-04-19 05:45:22

相关问题