类族模式是一种很常用的模式,可以隐藏抽象基类背后的实现细节。objective的系统框架中普遍使用此模式。比如iOS的系统界面框架UIKIT中就有一个名叫UIButton的类。想创建按钮,需要调用下面这个类方法。+(UIButton *)buttonWithType:(UIButtonType);改方法所返回的对象,其类型取决于传入的按钮类型(buttonType),然而不管返回什么类型的对象,它们都继承自同一个基类:UIButton。这么做的意义在于:UIButton类的使用者无需关心创建出来的按钮具体属于哪个子类,只需要传入创建的按钮类型就可以了。
创建类族
现在来演示如何创建类族。假设有一个处理雇员的类,每个雇员都有名字,薪水这两个属性,管理者可以命令去做工作,但是每个雇员的工作内容各不相同,管理者带领雇员做工作的时,无需关心每个人如何工作,只要下达开工命令即可。
首先定义抽象基类:
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
typedef NS_ENUM (NSInteger,EOCEmployeeType){
EOCEmployeeTypeDevelop,
EOCEmployeeTypeDesigner,
EOCEmployeeTypeFinance,
};
@interface EOCEmployee : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic,assign) NSInteger salary;
+ (EOCEmployee *)employeeWithType:(EOCEmployeeType)type;
- (void)doWork;
@end
#import "EOCEmployee.h"
#import "EOCEmployeeDevelop.h"
#import "EOCEmployeeFinance.h"
#import "EOCEmployeeDesigner.h"
@implementation EOCEmployee
+ (EOCEmployee *)employeeWithType:(EOCEmployeeType)type{
switch (type) {
case EOCEmployeeTypeDevelop:
return [[EOCEmployeeDevelop alloc] init];
break;
case EOCEmployeeTypeDesigner:
return [[EOCEmployeeDesigner alloc] init];
break;
case EOCEmployeeTypeFinance:
return [[EOCEmployeeFinance alloc] init];
break;
default:
break;
}
}
- (void)doWork{
}
每个实体子类都由基类继承而来如:
#import "EOCEmployee.h"
@interface EOCEmployeeDesigner : EOCEmployee
@end
#import "EOCEmployeeDesigner.h"
@implementation EOCEmployeeDesigner
- (void)doWork{
NSLog(@"EOCEmployeeDesigner");
}
@end
这么做的好处是使用工厂方法隐藏了子类的实现细节,只需要传入枚举类型,就可以下达命令实现功能。
网友评论