类方法是Objective-C中实现工厂方法的最佳方法吗?

时间:2011-09-24 22:06:45

标签: objective-c design-patterns factory factory-pattern

似乎我在Objective C中看到很多类方法,如+(NSString*)stringWithString:(NSString *)string+(NSArray)arrayWithArray:(NSArray *)array等。我刚开始考虑设计模式,对我来说这些方法看起来像小工厂根据提供的参数生成字符串或数组的特定实现(stringWith string ,string ByAppendingString )。实质上,这看起来很像工厂方法,其参数在设计模式一书中有所体现。有一个更好的方法吗?我应该创建混合这些类方法和实例方法的接口,还是仅创建没有任何实例方法的Factory对象?我很困惑。

4 个答案:

答案 0 :(得分:4)

虽然Apple claims这些方法是工厂方法,但我认为它们与设计模式中的工厂方法模式不同。 DP 工厂方法模式使用抽象Creator类,具有生成具体Product类的具体子类。您描述的方法(通常称为“便利构造函数”)几乎从未以这种方式实现。 Apple对工厂方法的定义是“一种类方法,为方便客户端,创建类的实例。工厂方法在一个步骤中组合分配和初始化,并返回类的自动释放实例。”这就是为什么我认为“便利构造函数”这个术语比“工厂方法”更合适,更少混淆。

NSString是一个class cluster,它与工厂方法模式有一些相似之处,因为您可以从同一个方法调用中接收不同的具体类。但是类集群与Factory方法的不同之处在于超类知道所有子类,并且它是调用者与之交互的超类。在Factory Method模式中,调用者与Creator类的子类进行交互。

所以对你的问题:你应该在方便调用者时创建便利方法。补充:

Foo *foo = [[[Foo alloc] initWithSomething:something] autorelease];

Foo *foo = [Foo fooWithSomething:something];

我建立这些的经验是90%的时间你不应该这样做。这不值得额外的代码。您应该等到initWithSomething:被称为 lot 后面跟autorelease,然后添加便利构造函数以使事情更方便。 stringWith...之类的东西都在这个课程中。他们被称为很多。

答案 1 :(得分:0)

根据定义,工厂方法必须是类方法,因为您需要类来生成新实例。 Apple的框架使用混合的工厂方法(例如arrayWithObjects)和非工厂初始化(initWithObjects)。

除此之外,我不确定我理解你的问题。对于大多数非平凡的类,您将同时拥有类工厂方法和实例初始化方法。

答案 2 :(得分:0)

这些方法通常被文档描述为方便方法 - 写[NSString stringWithString:s]只比编写[[[NSString alloc] initWithString:s] autorelease]短,但他们也做同样的事情。

关于工厂角度,我觉得你是否将这些方法视为一种工厂是一个品味问题,取决于你对工厂的确切定义。

答案 3 :(得分:0)

Objective-C中的类也是对象(Class Objects),工厂类设计模式是语言的一部分。