"类族"是一种很有用的模式(pattern),可以隐藏“抽象基类”背后的实现细节。
比如UIKit框架中的UIButton类,想创建按钮,需要调用下面这个"类方法":
+ (instancetype)buttonWithType:(UIButtonType)buttonType;
该方法返回的对象,其类型取决于传入的按钮类型(button type)。然而,不管返回什么类型的对象,他们都继承自同一个基类:UIButton。这么做的意义在于:UIButton类的使用者无须关心创建出来的按钮具体属于哪个子类,也不用考虑按钮的绘制方式等实现细节。使用者只需要明白如何创建按钮,如何设置“标题”(title)这样的属性,如何增加触摸动作的目标对象等问题就好。
定义抽象基类
MZWorker.h
#import <Foundation/Foundation.h>
typedef NS_ENUM(NSUInteger, MZWorkerType) {
MZWorkerTypeCoder,
MZWorkerTypeHR,
MZWorkerTypeFinance,
};
@interface MZWorker : NSObject
+ (instancetype)workerWithType:(MZWorkerType)type;
- (void)printMyOwnJobName;
@end
MZWorker.m
#import "MZWorker.h"
#import "MZHR.h"
#import "MZCoder.h"
#import "MZFinance.h"
@implementation MZWorker
+ (instancetype)workerWithType:(MZWorkerType)type {
switch (type) {
case MZWorkerTypeHR: {
return [[MZHR alloc] init];
}
break;
case MZWorkerTypeFinance: {
return [[MZFinance alloc] init];
}
break;
case MZWorkerTypeCoder: {
return [[MZCoder alloc] init];
}
break;
}
}
// 需要由子类重写
- (void)printMyOwnJobName {
}
@end
以MZCoder为例
#import "MZWorker.h"
@interface MZCoder : MZWorker
@end
#import "MZCoder.h"
@implementation MZCoder
- (void)printMyOwnJobName {
NSLog(@"MZCoder");
}
@end
使用
[[MZWorker workerWithType:MZWorkerTypeCoder] printMyOwnJobName]; ///< 打印:MZCoder
[[MZWorker workerWithType:MZWorkerTypeFinance] printMyOwnJobName]; ///< 打印:MZFinance
[[MZWorker workerWithType:MZWorkerTypeHR] printMyOwnJobName]; ///< 打印:MZHR
网友评论