我正在开发一个Swift应用程序。我希望为应用程序设计一个系统,使对象之间的耦合度较低。其中一种策略(我在其他语言中成功使用过)是创建我所谓的实例工厂。它非常简单,以下是我在Swift中想出的基本实现:
import Foundation
private var typeGenerators = Dictionary<String, InstanceFactory.GeneratorCallback>()
public class InstanceFactory: NSObject {
public typealias GeneratorCallback = () -> AnyObject!
public class func registerGeneratorFor(typeName: String, callback: GeneratorCallback) {
typeGenerators[typeName] = callback
}
public class func instanceOf(typeName: String) -> AnyObject! {
return typeGenerators[typeName]?()
}
}
这个想法是,当一个对象实例需要访问另一个对象实例时,第一个对象不会直接创建该实例,这将使两个对象之间的耦合更紧密。相反,第一个对象将通过调用instanceOf方法来委托工厂提供所需的实例。工厂将知道如何提供各种实例类型,因为这些类型将向工厂注册,并提供一个可以生成实例的闭包。
关键是如何让类与工厂注册。我之前在Objective-C中制作了一个类似的工厂,我让每个需要向工厂注册的类重写了+load方法。这对于Objective-C很有效,我觉得它也可以适用于Swift,因为我将限制工厂仅提供从NSObject派生的对象。看起来我已经做到了这一点,我花费了大量的精力设计类来利用工厂。
但是,在升级到Xcode 6.3后,我发现苹果禁止在Swift中使用load类方法。没有这个,我不知道有什么机制可以允许类自动向工厂注册。
我想知道是否有其他方法可以使类与工厂注册,或者还有哪些其他技术可以实现工厂提供的松散耦合?