类簇(Class Clusters)
引入类簇(Class Clusters)设计模式后,所有的子类均继承自一个抽象的父类(abstract superclass),而具体的子类又是私有的(private subclass),程序员只能通过其共同的抽象父类来生成子类对象,比如上图中的抽象父类是Number那么问题出现了,既然只能通过Number公开的接口来生成子类的对象,那么这个Number是怎么生成我们想要的具体子类对象呢?
为了解决这个问题,类簇中的抽象父类必须定义出生成类簇中不同子类对象的方法(method),程序员通过给抽象父类发送不同的消息,抽象父类返回消息所对应的子类的对象,这就是抽象父类的使命。拿NSNumber类举个例子,NSNumber是一个类簇的抽象父类,下面有Char,Int,Float,Double等这些子类,你可以通过给NSNumber发送如下消息来生成不同子类的对象。
类簇,是由一个抽象的父类及一组私有化(private)的具体子类组成。程序员只能用父类对外提供的接口(interface)来生成类簇中某个具体的子类对象。如下图所示:
上图中,抽象类Number是类簇中各子类的父类,而用灰色表示的各个子类,是私有子类(private subclass),私有子类的意思是,程序员无法访问到这些子类,也无法直接用子类生成对象,程序员只能通过Number这个抽象父类对外公开的接口来生成各个具体子类的对象。
为什么需要这样来设计呢?类簇解决的是什么问题呢?让我们还是用上面的例子来说明。
在上图中,Char,UnsignedChar,Short,UnsignedShort,Int,UnsignedInt,LongInt这些子类,都可以存储数字,只不过是不同种类的数字,这些不同种类的数字实际上有很多共同的特点(比如可以从一种类型转换成另外一种,或者它们都可以转换成字符串(string)),那这些不同种类的数字,可以定义成一个类吗?这是不可以的,因为不同种类的数字,它们所占的内存空间并非一样大,如果将它们归并为一个类,效率是非常低的。基于这点现实的考虑,所以提出了类簇(Class Clusters)的设计模式来解决这个经常会出现的问题。其中抽象父类中来定义方法(可以实现比如不同子类间类型转换等等功能),而不定义属性。
NSNumber *aChar = [NSNumber numberWithChar:’a’];
NSNumber *anInt = [NSNumber numberWithInt:1];
NSNumber *aFloat = [NSNumber numberWithFloat:1.0];
NSNumber *aDouble = [NSNumber numberWithDouble:1.0];
上面每一个返回来的对象,aChar/anInt/aFloat/aDouble是类簇中不同子类的对象。让我们动手来试一试,通过类簇中的抽象类NSNumber来生成子类的对象并赋初值,然后再把它们打印出来吧!
{$ activeFileHint $}