对象、消息、运行期--9:类族模式

2023-11-22 08:19:20 浏览数 (1)

类族模式

这种模式最大的好处就是,可以隐藏抽象基类背后的复杂细节,使用者只需调用基类简单的方法就可以返回不同的子类实例。比如NSArray、NSDictionary、UIButton等

我们通过NSArray为例,先看俩个函数

  • -(BOOL)isKindOfClass:(Class)aClass; 接收者是否是aClass类的实例或者从这个类继承的任何类的实例。如果是返回yes
  • -(BOOL)isMemberOfClass:(Class)aClass; 接收者是否是aClass的实例,如果是返回yes。
代码语言:javascript复制
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个有效方法

0 人点赞