目标C中的工厂(设计模式)

Guy*_*aim 26 objective-c

我正在尝试在Objective C中创建一个工厂(设计模式)所以我做的事情如下:

+ (Car *)createCar:(int)color {
    if (color == 1) {
        return [CarFactory createBlueCar];
    } else if (color == 2) {
        return [CarFactory createRedCar];
    } else {
        return nil;
    }
}

+ (Car *)createBlueCar {
    // ...
}

+(Car*)createRedCar{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

不过,我不希望createBlueCarcreateRedCar可用公众,如果我没有在中定义这些.h文件,然后我得到缺少定义的警告.

我是一名前Java开发人员,也是Objective-C的新手 - 所以这可能只是一种不好的做法.如果是这样,这样做的好习惯是什么.

bbu*_*bum 49

最好的方法是使用类扩展.

.H

@interface MyClass : NSObject
@property(readonly) BOOL publiclyReadOnlyPrivatelyWritableFlag;
+ (id) myExposedFactoryMethod;
@end
Run Code Online (Sandbox Code Playgroud)

.M

#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
Run Code Online (Sandbox Code Playgroud)

类扩展是更好的解决方案,因为它是类接口的真正扩展,而类(没有相应的实现)仅仅是类实现方法的建议.也就是说,如果您没有实现在类扩展中声明的接口(方法),编译器将发出警告,但如果您对命名类别执行相同操作,则不会发出警告.

另请注意,类扩展允许您根据上面的示例readonlyreadwrite属性升级为属性.

  • +1这应该是公认的答案,因为它演示了如何做到这一点以及为什么. (2认同)