objective-c - Objective C 中的工厂(设计模式)

标签 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 中定义它们的话code> 文件然后我收到缺少定义的警告。

我以前是 Java 开发人员,现在是 Objective-C 的新手——所以这可能只是一种不好的做法,如果是的话,这样做的好做法是什么。

最佳答案

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

.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

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

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

关于objective-c - Objective C 中的工厂(设计模式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2102685/

相关文章:

ios - 使用 UIScrollview 滚动 UITextview

objective-c - NSUndoManager + endUndoGrouping 调用但没有匹配的开始

ios - 在后台线程中运行 NSTimer 以在主线程中完成时调用方法

ios - 连接 IBOutlet 导致 nsunknownkey 异常

objective-c - 在 objective-c 中声明双数组

objective-c - iPad 3 慢截图

iphone - 处理大量 MKMapView 注释

objective-c - 如何从数组中获取唯一值

iphone - 转换前。 2010-09-11T00 :00:00+01:00 format to NSDate

ios - UIpicker查看数据源