Factory (design pattern) in Objective C
我试图在目标C中创建一个工厂(设计模式)所以我做了如下的事情:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | + (Car *)createCar:(int)color { if (color == 1) { return [CarFactory createBlueCar]; } else if (color == 2) { return [CarFactory createRedCar]; } else { return nil; } } + (Car *)createBlueCar { // ... } +(Car*)createRedCar{ // ... } |
但是,我不希望
我以前是Java开发人员,是Objtovi-C中的新手,所以这可能只是一个糟糕的实践。
最好的方法是使用类扩展。
h
1 2 3 4 | @interface MyClass : NSObject @property(readonly) BOOL publiclyReadOnlyPrivatelyWritableFlag; + (id) myExposedFactoryMethod; @end |
m
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #import"MyClass.h" @interface MyClass () @property(readwrite) BOOL publiclyReadOnlyPrivatelyWritableFlag; + (id) privateMethod1; + (id) privateMEthod2; @end @implementation MyClass @synthesize publiclyReadOnlyPrivatelyWritableFlag; // no ivar -- only works in 64 bit and iPhone + (id) myExposedFactoryMethod { ... [self privateMethod1]; ... } + (id) privateMethod1; { return ... } + (id) privateMEthod2; { return ... } @end |
类扩展是更好的解决方案,因为它是类接口的真正扩展,而类别(没有相应的实现)只是类实现方法的建议。也就是说,如果不实现类扩展中声明的接口(方法),编译器将发出警告;但是,如果对命名类别执行了相同的操作,编译器将不发出警告。
请注意,类扩展允许您按照上述示例将
我认为您可以使用实现(而不是接口)文件中的objective-c类别将它们添加到类中,作为一种模仿私有方法的方法,如果您想对类的用户"隐藏"它们的话。
注意,尽管您将不再向类的客户宣传这些方法,但是如果他们使用正确的选择器,他们仍然可以使用它们。此外,它们总是可以使用类转储之类的东西来重新生成类的完整接口,这样您的方法就永远不会真正隐藏。
有关在Objective-C下创建"私有"方法的更多示例,请参见此问题。
可以创建私有静态函数
1 2 3 4 5 6 7 8 9 10 11 12 13 | @implementation Car static createBlueCar () { .... } +(Car*) createCar:(int) color{ if (color==1) { return createBlueCar(); } ... } @end |
但不,您不能创建真正的私有成员。(您可以在私有类别中调用一些约定,例如