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

时间:2015-05-21 08:24:42

标签: ios objective-c factory-pattern

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

Car *car = [Car carOfType:CarTypeTesla];

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

+ (instanceType)carOfType:(CarType)carType {

    switch (carType) {
        case: CarTypeTesla: {

            return [[Tesla alloc] init];
        }

        case: CarTypeMustang: {

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

所以回到主文件中可以做到这样的事情(而且我不必暴露我的特斯拉,Mustang和其他20个子类):

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

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

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

1 个答案:

答案 0 :(得分:1)

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

我看到它的方式你必须选择: 1 - 您在所有汽车类中实现所有方法,并且当它们不相关时让它们返回空值,在这种情况下,image["xlink:href"]实例将为Tesla返回0或者 2 - 您为不同类型的汽车实施协议,例如gasFuelRemainingElectricCarProtocol,并在FuelCarProtocol类中使用一种称为Car的常用方法,该方法可以执行此操作:

fuelRemaining

希望这有帮助!