在NSNumber中用到了经常使用的一种设计模式-抽象工厂模式, 这也是NSNumber能很好的将c语言中各类基本数据类型封装成对象的缘由之一. 那么什么是抽象工厂模式呢? 抽象工厂模式又在什么时候使用以及如何使用. 下面我来谈谈我读完书后对它的理解,objective-c
抽象工厂模式的标准定义是提供一系列建立相关或或相互依赖对象的接口, 而无需指定他们具体的类.设计模式
举个咱们常见的例子来讲好比披萨. 披萨的种类特别多好比意大利披萨, 芝加哥披萨等等. 不一样的披萨里面的肉, 酱汁都会有所不一样, 可是他们都具备共同特色好比面包, 酱, 奶酪. 而咱们就把这些共同特色抽象成一种食物类型披萨. 它定义了披萨基本特征即共有特色, 制做披萨饼的师傅均可以称做“抽象”的披萨饼厨师. 而具体制做意大利披萨,芝加哥披萨的厨师则能够看做“具体”的披萨饼厨师, 这些厨师能作出特定类型的一种披萨, 咱们消费者只须要点特定一种披萨可是不须要知道具体知道每种披萨是怎么作出来的,markdown
上述例子中披萨厨师就能够视做抽象工厂, 而意大利披萨,芝加哥披萨的厨师能够看做具体的工厂, 厨师们知道披萨的基本特征, 制做披萨时都会按照基本的制做披萨的规则, 可是不一样披萨厨师的作法又会有所不一样, 他们以本身特定风味生厂出特定一种披萨饼.spa
再看一个更具体的例子就能很好理解抽象工厂.以下图所示:设计
咱们这里如今有一个抽象的品牌工厂类BrandingFactory, 而后他有两个具体工厂类SlerraBrandingFactory和AcmeBrandingFactory, 他们负责建立不一样品牌的视图组合(View, Button, Toobar), 具体工厂类在建立具体产品时会一些有不一样的作法(好比会加入各自的品牌标志). 然而调用者只知道 BrandingFactory、UIView、UIButton、 UIToobar这四个类, 而不知道内部实现细节的具体类. 使用者只须要使用BrandingFactory的factory方法建立一个抽象工厂类的实例, 而后经过一些参数告诉抽象工厂你想要生厂哪一种产品. 抽象工厂就会让具体工厂生产出一种品牌的视图组合, 而后调用工厂方法就能得到视图View、Button或者Toobar.code
具体使用为下列代码:orm
BrandingFactory *slerraBrandingFactory = [BrandingFactory factory];
/**这里还须要额外操做告诉抽象工厂你想要生厂哪一种产品*/
UIView *view = [slerraBrandingFactory brandView];
复制代码
NSNumber类中为咱们提供了不少类方法用于建立各类类型的NSNumber对象. 像下面这样对象
NSNumber *boolNumber = [NSNumber numberWithBool:YES];
NSNumber *charNumber = [NSNumber numberWithChar:'a'];
NSNumber *intNumber = [NSNumber numberWithInt:1];
NSNumber *doubleNumber = [NSNumber numberWithDouble:1.0];
复制代码
不一样的工厂方法实际会创造出属于不一样具体工厂类的对象, 咱们能够使用NSLog打印一下每一个对象所属类的描述.接口
NSLog(@"%@", [[boolNumber class]description]);
NSLog(@"%@", [[charNumber class]description]);
NSLog(@"%@", [[intNumber class]description]);
NSLog(@"%@", [[doubleNumber class]description]);
复制代码
打印结果以下: ip
从打印结果能够看出来对象所属的类确实不是都相同的. NSCFBoolean和NSCFNumber就是NSNumber的具体子类. 上述四个对象就是具体子类的实例, 可是它们都支持NSNumber的公有接口.
虽然他们属于不一样的具体子类, 可是其行为都有抽象超类NSNumber定义. 咱们尝试执行下面的代码段看看.
NSLog(@"%d", [boolNumber intValue]);
NSLog(@"%@", [charNumber boolValue] ? @"YES": @"NO");
复制代码
控制台输出:
boolNumber内部保持了布尔值YES, 但仍实现了公有intValue方法, 返回反映其内部布尔值的合适整形值, 一样charNumber也实现了公有boolValue方法, 返回反映其内部字符值‘a’的合适布尔值.
接受不一样类型的参数值并返回NSNumber实例的使用了类工厂方法. 使用numberWithBool就建立NSCFBoolean工厂的实例, 使用numberWithInt就建立NSCFNumber的实例, 而后他们都实现了NSNumber抽象工厂类对象的的公有方法好比intValue、boolValue. 然而咱们调用时并不知道它到底实际属于NSCFBoolean仍是NSCFNumber, 只须要把它看成NSNumber的实例, 而且调用它提供的公有方法.