C中的工厂(设计模式)

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

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

我以前是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

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

请注意,类扩展允许您按照上述示例将readonly属性升级为readwrite属性。


我认为您可以使用实现(而不是接口)文件中的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

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