繁体   English   中英

Objective-C对象设计模式

[英]Objective-C object design pattern

想知道人们如何在程序中设计对象和使用设计模式。

例如:

假设我有两种类型的汽车(宝马,奔驰)和两种颜色(黑色,白色),但颜色对象已经存在,有两种方法,

[Color initWithBlack];
[Color initWithWhite];

在.h文件中定义两个方法

- (Car *)makeWithType:(NSString *)type;
- (Car *)makeWithType:(NSString *)type andColor:(NSString *)color;

在.m文件中

- (Car *)makeWithType:(NSString *)type
{
    // default is black
    return [self makeWithType:type andColor:@"black"];
}

- (Car *)makeWithType:(NSString *)type andColor:(NSString *)color
{
    Car *car = [[Car alloc] init];
    car.type = type;
    switch(color) {
        case "black":
            [car addColor:[Color initWithBlack]];
            break;
        case "white":
            [car addColor:[Color initWithWhile]];
            break;
        default:
            break;
    }
    return car;
}

这是定义和实现对象的正确方法吗?

是否存在松散或紧密的依赖关系?

如果它很紧,我怎样才能改进设计以减少耦合?

在我看来,这是一个典型的工厂模式 ,你有一个为你创建对象的对象/类。 在这种情况下,我可以称之为CarsFactory ,方法可以是类方法(+)而不是实例( - ),所以:

+ (Car *)makeWithType:(NSString *)type;
+ (Car *)makeWithType:(NSString *)type andColor:(NSString *)color;

您还可以在自己的课程中了解Apple如何应用它 这也是Jon Reid的一篇有趣的文章

假设汽车类型本身没有为汽车类增加任何东西,那么你拥有的东西会有些正确。

那里有一些缺陷,首先是- (Car *)makeWithType:(NSString *)type; 方法应该是一个类方法而不是实例方法。 让它成为一个实例方法会失去拥有它的目的,因为需要初始化一个虚拟汽车然后通过它创建正确的汽车。

此外,如果在某些时候您发现宝马可以拥有奔驰不具备的属性,那么子类化将更合适。 请注意,您仍然可以保留类似的类方法来创建汽车,但在其中,确定正确的子类并返回该类的实例。 这就是他们所谓的类集群。 例如,UIButton是一个类集群,它接受一个类型并返回给定类型的合适的具体子类。

更多的东西,如果你有常量,如汽车品牌或颜色,那么除非颜色对象做某事,那么你最好使用枚举代替字符串和对象。 这有一些优点,首先是清晰度,现在不知道在查看Car头文件时可用的类型/颜色。 使用枚举,您可以立即看到可用的值。 第二是正确性,使用字符串很容易出错并且编译器没有检查是否正确,如果你使用了未定义的值,你会得到一个大的红色警告。

所以作为一个结论,这里是我将用于Car类的标题(假设BMW和Benz只是类型并且对汽车没有特殊意义)

typedef NS_ENUM(NSUInteger, CarMake) {
    CarMakeBMW,
    CarMakeBenz,
};

typedef NS_ENUM(NSUInteger, CarColor) {
    CarColorBlack,
    CarColorWhite,
};

@interface Car : NSObject

+ (Car *)makeWithType:(CarMake)make;
+ (Car *)makeWithType:(CarMake)make andColor:(CarColor)color;

@end

如果你真的需要使用Color对象(顺便说一句,请注意initWithWhi(t)e方法名称中有一个拼写错误),那么你应该将该颜色传递给方法,而不是引用该颜色的字符串。 或者,通过在类方法中根据传入的枚举值创建合适的对象,使用上面的标题和颜色对象的混合。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM