返回

设计模式(Swift) - 2.单例模式、备忘录模式和策略模式

IOS

单例模式、备忘录模式和策略模式:Swift 中的实用设计模式

单例模式

单例模式确保了一个类只有一个实例,并提供了一个全局访问点。它常用于管理资源,例如数据库连接或全局变量。

在 Swift 中,可以通过两种方法实现单例模式:

  1. 全局变量:
class Singleton {
    static let shared = Singleton()
    private init() {}
}
  1. 静态属性:
class Singleton {
    static var shared: Singleton {
        get {
            if sharedInstance == nil {
                sharedInstance = Singleton()
            }
            return sharedInstance!
        }
    }

    private init() {}
    private static var sharedInstance: Singleton?
}

备忘录模式

备忘录模式存储一个对象的当前状态,以便在需要时还原到该状态。它常用于保存复杂对象的快照或实现撤销操作。

在 Swift 中,备忘录模式可以通过以下两种方式实现:

  1. 归档/解归档:
class Memento {
    private let state: String

    init(state: String) {
        self.state = state
    }

    func getState() -> String {
        return state
    }
}

class Originator {
    private var state: String

    init(state: String) {
        self.state = state
    }

    func setState(state: String) {
        self.state = state
    }

    func saveState() -> Memento {
        return Memento(state: state)
    }

    func restoreState(memento: Memento) {
        state = memento.getState()
    }
}
  1. 快照:
class Memento {
    private let snapshot: [String: Any]

    init(snapshot: [String: Any]) {
        self.snapshot = snapshot
    }

    func getSnapshot() -> [String: Any] {
        return snapshot
    }
}

class Originator {
    private var state: [String: Any]

    init(state: [String: Any]) {
        self.state = state
    }

    func setState(state: [String: Any]) {
        self.state = state
    }

    func saveState() -> Memento {
        return Memento(snapshot: state)
    }

    func restoreState(memento: Memento) {
        state = memento.getSnapshot()
    }
}

策略模式

策略模式允许算法的行为在不改变客户端的情况下发生变化。它通过分离算法和客户端来实现,使客户端能够动态地选择不同的算法。

在 Swift 中,策略模式可以通过以下两种方式实现:

  1. 枚举:
enum Strategy {
    case a, b, c
}

class Context {
    private var strategy: Strategy

    init(strategy: Strategy) {
        self.strategy = strategy
    }

    func executeStrategy() {
        switch strategy {
            case .a:
                // Do something
                break
            case .b:
                // Do something else
                break
            case .c:
                // Do something else
                break
        }
    }
}
  1. 闭包:
typealias Strategy = (Int, Int) -> Int

class Context {
    private var strategy: Strategy

    init(strategy: Strategy) {
        self.strategy = strategy
    }

    func executeStrategy(a: Int, b: Int) -> Int {
        return strategy(a, b)
    }
}

这些模式的应用

这些模式在现实世界的应用程序中有很多用处:

  • 单例模式可用于管理应用程序范围的设置或数据,如用户偏好或数据库连接。
  • 备忘录模式可用于实现撤销/重做功能、保存和加载游戏状态或跟踪对象的历史记录。
  • 策略模式可用于支持算法的动态选择,例如根据用户偏好选择排序算法或根据条件选择不同的业务逻辑。

结论

单例模式、备忘录模式和策略模式是 Swift 中强大的设计模式,可以显著提高应用程序的可维护性、可重用性和可扩展性。通过理解和利用这些模式,开发人员可以创建健壮且灵活的应用程序。

常见问题解答

  1. 为什么要使用单例模式?

    • 确保只有一个类的实例,并提供一个全局访问点。
  2. 备忘录模式如何与快照模式不同?

    • 归档/解归档模式将整个对象的状态存储为二进制数据,而快照模式将对象的状态存储为键值对字典。
  3. 策略模式什么时候有用?

    • 当需要动态更改算法的行为而不需要修改客户端代码时。
  4. 单例模式的缺点是什么?

    • 可能会导致全局状态的过度使用,并使单元测试变得困难。
  5. 备忘录模式的优势是什么?

    • 允许在不影响原始对象的情况下回滚对象的状态,并且可以实现轻量级撤销/重做功能。