Swift设计模式:从基础到实践
设计模式(Design Patterns)是经过验证的典型开发问题解决方案。在Swift和Apple生态系统(iOS/macOS)中,掌握设计模式对于创建可维护、可测试和可扩展的代码至关重要。本文将深入解析关键设计模式,将其分为三大类别:创建型、结构型和行为型。每种模式都将通过Swift工作示例进行说明。
创建型模式:单例、工厂方法和建造者
创建型模式负责对象创建过程,使其更加灵活且独立于客户端代码。
Singleton(单例)
确保一个类只有一个实例,并提供全局访问点。在iOS中常用于管理网络会话、数据库(Core Data)或应用程序设置。
class NetworkManager { static let shared = NetworkManager() private init() {} func fetchData(from url: URL) { // 请求逻辑 print("Fetching data from \\(url)") }}
// 使用NetworkManager.shared.fetchData(from: URL(string: "https://example.com")!)Factory Method(工厂方法)
定义创建对象的接口,但允许子类更改所创建对象的类型。非常适合根据iOS版本或配置创建UI组件。
protocol Button { func render()}
class iOSButton: Button { func render() { print("Rendering iOS button") }}
class macOSButton: Button { func render() { print("Rendering macOS button") }}
enum Platform { case iOS, macOS }
class ButtonFactory { static func createButton(for platform: Platform) -> Button { switch platform { case .iOS: return iOSButton() case .macOS: return macOSButton() } }}
// 使用let button = ButtonFactory.createButton(for: .iOS)button.render()Builder(建造者)
允许逐步创建复杂对象。广泛用于配置请求(URLRequest)或复杂的UI设置。
class Pizza { var dough: String = "" var cheese: String = "" var toppings: [String] = []}
class PizzaBuilder { private var pizza = Pizza() func setDough(_ dough: String) -> PizzaBuilder { pizza.dough = dough return self } func setCheese(_ cheese: String) -> PizzaBuilder { pizza.cheese = cheese return self } func addTopping(_ topping: String) -> PizzaBuilder { pizza.toppings.append(topping) return self } func build() -> Pizza { return pizza }}
// 使用let margherita = PizzaBuilder() .setDough("Thin") .setCheese("Mozzarella") .addTopping("Basil") .build()结构型模式:适配器、装饰器和外观
结构型模式通过定义对象和类组合成更大结构的方式来简化设计。
Adapter(适配器)
允许接口不兼容的对象协同工作。经典示例包括集成第三方库或处理遗留代码。
// 旧协议protocol OldPaymentSystem { func pay(amount: Double)}
// 新协议protocol NewPaymentSystem { func processPayment(amount: Double, currency: String)}
// 适配器class PaymentAdapter: NewPaymentSystem { private let oldSystem: OldPaymentSystem init(oldSystem: OldPaymentSystem) { self.oldSystem = oldSystem } func processPayment(amount: Double, currency: String) { // 货币转换 let convertedAmount = amount * 1.1 oldSy