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

时间:2010-01-20 15:51:06

标签: 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{
    // ...
}

但是,我不希望createBlueCarcreateRedCar可供公开使用,如果我没有在.h文件中定义它们,那么我会收到警告缺少定义。

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

3 个答案:

答案 0 :(得分:49)

执行此操作的最佳方法是使用类扩展。

<强>·H

@interface MyClass : NSObject
@property(readonly) BOOL publiclyReadOnlyPrivatelyWritableFlag;
+ (id) myExposedFactoryMethod;
@end

<强>的.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

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

另请注意,类扩展允许您根据上面的示例将readonly属性升级为readwrite属性。

答案 1 :(得分:4)

我认为你可以在实现(而不是界面)文件中使用objective-c category将它们添加到类中,作为一种模拟私有方法的方法,如果你想从类的用户“隐藏”它们。 / p>

请注意,虽然您不再向您的班级客户宣传这些方法,但如果他们使用正确的选择器,他们仍然可以使用它们。此外,他们总是可以使用类似classdump的内容来重新生成类的完整界面,这样您的方法就永远不会被隐藏。

有关在objective-c下创建“私有”方法的更多示例,请参阅this question

答案 2 :(得分:-1)

您可以创建私有静态功能

@implementation Car 

static createBlueCar () {
  ....
}

+(Car*) createCar:(int) color{
   if (color==1) {
     return createBlueCar();
   } ...
}

@end

但不,您无法创建真正的私人成员。 (您可以在私有类别中调用某些约定,例如+(Car*)private_createCar,以阻止其使用。)