美文网首页runtime相关iosiOS Runtime
iOS设计模式之类族(class cluster)

iOS设计模式之类族(class cluster)

作者: luguoliang | 来源:发表于2016-01-30 01:56 被阅读915次

    类族模式在UIKit(user interface framework)使用的范围已经远远超过我们的想象,比如,UIButton,NSArray,NSString等,这种模式最大的好处就是,可以隐藏抽象基类背后的复杂细节,使用者只需调用基类简单的方法就可以返回不同的子类实例。
    首先我们先来看这两个函数:
    - (BOOL)isKindOfClass:(Class)aClass;
    - (BOOL)isMemberOfClass:(Class)aClass;
    第一个函数的意思是:接收者是否是aClass类的实例或者从这个类继承的任何类的实例。如果是返回yes。
    第二个函数的意思是:接收者是否是aClass的实例,如果是返回yes。
    按照上面的解释我们执行下面两行代码输出结果应该是:isKindOfClass
    ,isMemberOfClass

     NSArray*array = [NSArray new];
     if ([array isKindOfClass:[NSArray class]]) {
        NSLog(@"isKindOfClass");
    }
    if ([array isMemberOfClass:[NSArray class]]) {
        NSLog(@"isMemberOfClass");
    }
    

    但是上面代码执行的输出结果却是:isKindOfClass。
    为什么会出现这种情况?isMemberOfClass为什么没有执行?array明明是NSArray的一个实例呀!难道不是吗?为了验证我们的怀疑我们在执行下面一段代码看看array到底是什么

    NSLog(@"%@",[[array class] debugDescription]);
    NSLog(@"%@", [[[NSArray arrayWithObject:@"a,b"] class] debugDescription]);
    

    输出:__NSArray0,__NSArrayI
    好吧,array果然不是NSArray的一个实例,但是上面输出了“isKindOfClass,这说明array是NSArray子类的一个实例,到底这种推断正不正确?我们再来验证一下:

    NSLog(@"%@",[[array superclass] debugDescription]);
    

    输出:NSArray
    好吧,果然是这样,写到这儿我们已经大致明白了,通过不同方法实例化的array都是NSArray子类的实例,NSArray是一个抽象的基类。这种模式就是类族模式。

    但是如果把NSArray换成UIButton又回出现截然相反的情况,出现这种情况的原因在于NSArray基类又对子类进行了重构,生成了多个子类。

    下面我们自己写一个类族,定义一个继承与NSObject的抽象基类LULEmployee,基类中定义一个枚举类型

    typedef NS_ENUM(NSUInteger,LULEmployeeType) {
    LULEmployeeTypeDevlopers,
    LULEmployeeTypeProducters,
    LULEmployeeTypeTesters,
    

    };

    为基类声明实现一个类方法和实例方法

    +(LULEmployee*)employeeWithType:  (LULEmployeeType)type{
    switch (type) {
        case 0:
            return [LULEmployeeTypeDevloper new];
            break;
            case 1:
            return [LULEmployeeTypeProducter new];
            break;
            
        default:
            return [LULEmployeeTypeTester new];
            break;
    }
    }
    -(void)doADayWork{
    
    }
    

    然后创建3个继承与基类的子类,并在子类中覆写-(void)doADayWork方法,
    Object-c demo https://github.com/luguoliang/Object-c-ClasscCluster.git
    Swift demo https://github.com/luguoliang/Swift-ClasscCluster.git

    相关文章

      网友评论

      • YummyDog:>但是如果把NSArray换成UIButton又回出现截然相反的情况

        我将NSArray替换成UIButton,最终的结果是两个都打印,这句话没有理解,求解答。
      • 哭泣的琉璃贝:感谢分享:heart:
      • 南栀倾寒:类簇吧

      本文标题:iOS设计模式之类族(class cluster)

      本文链接:https://www.haomeiwen.com/subject/ljgjkttx.html