Swift设计模式实例详解:从入门到精通

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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

博客

书籍推荐