Ree's Movements

Moving all the time, capture it.

创建对象的工厂方法

工厂方法模式是一种实现了“工厂”概念的面向对象设计模式。工厂方法模式的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。”

工厂方法的效果

  1. 最显而易见的是将 allocation 与 initialization 合到了一步,方便客户端来使用,并且能够在一定成都上防止开发者忘记 allocation 或者 initialization 中的一步而运行时的错误。

  2. 由于工厂方法在Objective-C 中的命名规则为+(type)className...,当客户端在使用此方法时,就能明确这个方法是专门为 classname 设计的,而非像initWith...一样让人不知此方法是否有被重写。

  3. 通过工厂方法可以进一步完成 singleton instance 模式。

  4. 在一些其它语言中(如Java, C++)中工厂方法有其更大的一个作用 -- 创建子类, Java 代码为(C++可用模版实现)

static Person create(String name) {
    try {
        return (Person) Class.forName(name).newInstance();
    } catch (Exception e) {
        throw new IllegalArgumentException("Unable to instantiate" + name);
    }
}

工厂方法的做法

  1. 在一个类中新建一个静态工厂函数并且以classNameWith...来命名,让它调用现有的构造函数(或者 Objective-C 中的 alloc & init 函数).

  2. 将工厂方法参数化,根据不同需求创建不同的工厂方法。

Objective-C 的例子

Cocoa Touch 有大量的例子,NSNumber 提供以下工厂方法:

+ (NSNumber *)numberWithChar:(char)value;
+ (NSNumber *)numberWithUnsignedChar:(unsigned char)value;
+ (NSNumber *)numberWithShort:(short)value;
+ (NSNumber *)numberWithUnsignedShort:(unsigned short)value;
+ (NSNumber *)numberWithInt:(int)value;
+ (NSNumber *)numberWithUnsignedInt:(unsigned int)value;
+ (NSNumber *)numberWithLong:(long)value;
+ (NSNumber *)numberWithUnsignedLong:(unsigned long)value;
+ (NSNumber *)numberWithLongLong:(long long)value;
+ (NSNumber *)numberWithUnsignedLongLong:(unsigned long long)value;
+ (NSNumber *)numberWithFloat:(float)value;
+ (NSNumber *)numberWithDouble:(double)value;
+ (NSNumber *)numberWithBool:(BOOL)value;

使用工厂方法创建 NSNumber 对象

NSNumber *myNumber = [NSNumber numberWithFloat: 1.234];

/* use alloc & init
 *
 * NSNumber *mynumber =  [[NSNumber alloc] initWithFloat: 1.234];
 *
 */