iOS:使用工厂设计模式动态更改可访问属性?

iOS: Using the Factory Design Pattern to Dynamically Change Accessible Properties?

我有以下示例,其中 CarTypeTesla 是一个枚举值。

Car *car = [Car carOfType:CarTypeTesla];

+ (instanceType)carOfType: 进行枚举检查并 returns 给定 Car 子类的实例,如下所示:

+ (instanceType)carOfType:(CarType)carType {

    switch (carType) {
        case: CarTypeTesla: {

            return [[Tesla alloc] init];
        }

        case: CarTypeMustang: {

            return [[Mustang alloc] init];
        }
    }
}

这样回到主文件就可以完成类似的事情(而且我不必公开我的 Tesla、Mustang 和其他 20 个子类):

Car *car = [Car carOfType:CarTypeTesla];
NSLog(@"%@", car.batteryChargeRemaining);

Car *car = [Car carOfType:CarTypeMustang];
NSLog(@"%@", car.gasFuelRemaining);

如何使用此工厂设计模式,根据提供的枚举值仅显示与返回的子类相关的属性/方法(使用 CarTypeTesla 时不想显示 -(float)gasFuelRemaining

您正在实施的是 iOS 中的 class 集群。一些框架 classes,比如 NSArray、NSString 和 NSDictionary 就是这样工作的(它们通过根据它们持有的数据量提供不同的解决方案来进行优化)。这允许您拥有一个通用的、通用的 class 公开给 API,同时隐藏与开发人员不一定相关的解决方案的所有复杂细节,包括基于上下文不同但应该行为相同。这意味着您拥有一个通用基础 class,其中包含在所有其他隐藏 class 中实现的通用方法。

按照我的看法,您必须选择: 1 - 您在所有汽车 classes 中实施所有方法,并在它们不相关时让它们 return 为空值,在这种情况下,您的 Tesla 实例将 return 0对于 gasFuelRemaining 或 2 - 您为不同类型的汽车实施协议,例如 ElectricCarProtocolFuelCarProtocol,并且在您的 Car class 中有一个名为 fuelRemaining 的通用方法这行:

if ([self conformsToProtocol:@protocol(ElectricCarProtocol)]) {
    return self.batteryChargeRemaining; // you might need to cast the object here
}
return self.gasFuelRemaining; // idem

希望对您有所帮助!