[Swift设计模式] 抽象工厂

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

Swift中的抽象工厂

抽象工厂提供一种封装一组独立工厂的方式,这些独立工厂都有一个共同的主题。

抽象工厂的实现通常结合了简单工厂和工厂方法的准则。工厂方法创建独立的对象,然后所有的事情再经过一个“抽象的”的简单工厂包装起来。让我们一起来看下范例代码。 😅

// 服务协议
protocol ServiceFactory {
    func create() -> Service
}

protocol Service {
    var url: URL { get }
}

// 筹划阶段
class StagingService: Service {
    var url: URL { return URL(string: "https://dev.localhost/")! }
}

class StagingServiceFactory: ServiceFactory {
    func create() -> Service {
        return StagingService()
    }
}

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

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

// 抽象工厂
class AppServiceFactory: ServiceFactory {

    enum Environment {
        case production
        case staging
    }
    
    var env: Environment

    init(env: Environment) {
        self.env = env
    }

    func create() -> Service {
        switch self.env {
        case .production:
            return ProductionServiceFactory().create()
        case .staging:
            return StagingServiceFactory().create()
        }
    }
}

let factory = AppServiceFactory(env: .production)
let service = factory.create()
print(service.url)

如你所见,使用抽象工厂将会影响整个应用的逻辑,而工厂方法只影响到局部。在实现抽象工厂的时候,也可以为它创建一个单独的接口。

抽象工厂通常用于实现对象的独立。举个例子,如果你有多个不同的SQL数据库连接器(PostgreSQL, MySQL等),在 Swift 中用一个通用接口表示,你可以利用抽象工厂在它们之间轻松地切换。 类似的场景都能用这种模式。 🤔

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