[Swift设计模式] 工厂方法

286 阅读2分钟
更多内容欢迎关注公众号:Swift花园

工厂方法只是一个非静态方法

说起工厂方法模式,十分简单。它通常是由简单的协议和类实现的。让我们从一个最简单的粒子开始吧:想象一个类,它能为你的服务终端创建一个 URL,姑且称它为服务工厂吧。 😅

class ServiceFactory {
    func createProductionUrl() -> URL {
        return URL(string: "https://localhost/")!
    }
}
let factory = ServiceFactory()
factory.createProductionUrl()

你可能会想,这个跟工厂方法模式有啥关系呢?且慢,让我再加一些东西,一个服务类的协议和一个返回 url 的协议。现在我们可以单独实现基础的 url 协议,并且从产品服务工厂那获得特定的实现:

protocol ServiceFactory {
    func create() -> Service
}

protocol Service {
    var url: URL { get }
}

class ProductionService: Service {
    var url: URL { return URL(string: "https://localhost/")! }
}

class ProductionServiceFactory: ServiceFactory {
    func create() -> Service {
        return ProductionService()
    }
}

let factory = ProductionServiceFactory()
let request = factory.create()

为什么要把逻辑分成两个协议加两个类呢?相信我,解耦会是一件好事。从现在开始,你可以轻松地实现一个模拟的服务,返回一个虚拟的url,用这个url来测试代码。明显地,这样将需要用到一个与服务匹配的工厂类。

有了这些模拟的实例,你可以在实现服务协议的同时无痛地添加新的类型,而不必动到原始的代码。工厂方法一次解决一个简单工厂模式的特定问题。如果 switch-case 里的列表太长,只用一个工厂来维护对象创建将会变得很困难。工厂方法通过引入多个工厂对象解决这个问题。

我的公众号
这里有Swift及计算机编程的相关文章,以及优秀国外文章翻译,欢迎关注~