类族模式
这种模式最大的好处就是,可以隐藏抽象基类背后的复杂细节,使用者只需调用基类简单的方法就可以返回不同的子类实例。比如NSArray、NSDictionary、UIButton等
我们通过NSArray为例,先看俩个函数
- -(BOOL)isKindOfClass:(Class)aClass; 接收者是否是aClass类的实例或者从这个类继承的任何类的实例。如果是返回yes
- -(BOOL)isMemberOfClass:(Class)aClass; 接收者是否是aClass的实例,如果是返回yes。
NSArray *array = [[NSArray alloc]init];
if ([array isKindOfClass:[NSArray class]]) {
NSLog(@"isKindOfClass");
}
if ([array isMemberOfClass:[NSArray class]]) {
NSLog(@"isMemberOfClass");
}
log:isKindOfClass
很明显array不是NSArray的一个实例
代码语言:javascript复制NSLog(@"%@",[[array superclass] debugDescription]);
log:NSArray
通过这个可以证明NSArray是一个抽象的基类,而array是NSArray子类实例化出来的一个对象,这种设计模式就是类族模式
接下来写一个demo来说明类族
代码语言:javascript复制#import <Foundation/Foundation.h>
//定义一个继承与NSObject的抽象基类Phone,基类中定义一个枚举类型
typedef NS_ENUM(NSInteger,PhoneType){
PhoneTypeiPhone,
PhoneTypeAndroid,
};
@interface Phone : NSObject
(Phone *)phoneType:(PhoneType)type;
- (void)call;
@end
#import "Phone.h"
#import "iPhone.h"
#import "AndroidPhone.h"
@implementation Phone
//为Phone声明实现一个类方法和实例方法
(Phone *)phoneType:(PhoneType)type{
switch (type) {
case PhoneTypeiPhone:
return [iPhone new];
break;
case PhoneTypeAndroid:
return [AndroidPhone new];
break;
}
}
- (void)call{
}
@end
代码语言:javascript复制//创建2个继承与Phone的子类
#import "Phone.h"
@interface iPhone : Phone
@end
#import "iPhone.h"
@implementation iPhone
- (void)call{
NSLog(@"iPhone call");
}
@end
代码语言:javascript复制//创建2个继承与Phone的子类
#import "Phone.h"
@interface AndroidPhone : Phone
@end
#import "AndroidPhone.h"
@implementation AndroidPhone
- (void)call{
NSLog(@"AndroidPhone call");
}
@end
代码语言:javascript复制Phone *iphone =[Phone phoneType:PhoneTypeiPhone];
[iphone call];
Phone *andriod =[Phone phoneType:PhoneTypeAndroid];
[andriod call];
log:
iPhone call
AndroidPhone call
参考
Effective Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法