1

我浏览了 GNUStep 的 NSNumber 实现的源代码,以了解工厂方法实现是如何在那里工作的。

从那里我可以理解的是,对于所有 initWithXYZ 类型的方法,我们都有 NSNumber 和空白实现。NSTemporaryNumber 就像层次结构中的一个中间类,它实现了所有 initWithXYZ 方法,其中它实际上创建了特定类型的对象,自动释放自身并返回创建的对象。

此外,allocWithZone 被覆盖以避免创建 NSNumber 对象并创建 NSTemporaryNumber 的对象,否则创建特定类型的对象。

我不明白的是,NSNumber 本身不能做同样的事情吗?为什么要给出空白实现,创建特定类型的对象,然后自动释放自我。

此外,如果我们在 NSNumber 本身中实现了 createXYZ 方法,为什么还要使用 initWithXYZ 方法?

如果我必须为我的项目实现一个工厂实现,比如说我有两个 mediaItems、video、audio 和 photo 等,我有单独的类和相应的枚举,我将它们传递给 initWithMediaType,它们将创建一个正确子类的对象,返回它并摧毁自己。

有两个类,如 NSNumber 和 NSTemporaryNumber:比如 Media 和 TemporaryMedia,一个具有空白实现,另一个具有上述实现?

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

我的问题可能看起来很愚蠢,但我来自 Java、C++ 背景,情况看起来不同。目的可能是相同的,但我发现很难理解 Objective C 的方式,因为它没有抽象类。

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

4

1 回答 1

1

关键是这NSNumber是一个类集群。你最终得到的类可能是一个NSIntNumber,一个NSFloatNumber或几个其他的一个。它们都响应相同的消息NSNumber(并且,通常在此模式中将是它的子类,但这不是必需的),因此它对调用者没有真正的影响。

当您调用时alloc,无法知道要创建哪种对象,因此会创建并返回中性类型。它在收到适当的init.

所以这个模式是用于类集群的实现。如果编写一个只提供自身实例的类,您可以忽略它。

于 2012-04-18T14:50:22.103 回答