设计模式学习-原型模式

283 阅读1分钟

原型模式相关概念

原型模式通过克隆已有的对象来创建新的对象,已有的对象即为原型.

使用这个模式的好处

  • 隐藏了创建对象的代码,即代码对于使用它的组件是不可见的
  • 避免重复初始化过程。
  • 避免对类模板的依赖

什么时候使用 当需要创建新的实例,但又不想依赖类的构造方法。可以使用这个模式

  • 深拷贝和浅拷贝
  • 代码结构混乱(必须暴露原型对象,用于拷贝)

原型模式例子:

将一个值类型赋值给变量的时候,Swift会自动使用原型模式。 值类型是使用结构体定义的。

我们定义一个结构体 Appointment。其结构如下面代码

import UIKit

///结构体为值类型,默认会就行深拷贝
struct Appointment{
    var name:String
    var day:String
    var place:String

    func printDetail(label:String) {
        print("\(label) with \(name) on \(day) at \(place)")
    }
    
}

实例化一个 beerMeeting。然后把beermetting 赋值给workmeeting。并修改一些值。

var  beerMeeting = Appointment(name: "Bob", day: "Mon", place: "BeiJing")
beerMeeting.printDetail(label: "beerMeeting")

var workMeeting = beerMeeting
workMeeting.name = "Alice"
workMeeting.day = "Fri"
//workMeeting.place = "Shanghai"

workMeeting.printDetail(label: "workmeeting")

let beerPointer = withUnsafePointer(to: &beerMeeting, { $0 })
let workPointer = withUnsafePointer(to: &workMeeting, { $0 })

print(beerPointer)
print(workPointer)

print(beerMeeting)
print(workMeeting)

下面是打印的结果,可以看到Swift自动对 beerMetting进行了一次深拷贝。

beerMeeting with Bob on Mon at BeiJing
workmeeting with Alice on Fri at BeiJing
0x00000001142bc920
0x00000001142bc968
Appointment(name: "Bob", day: "Mon", place: "BeiJing")
Appointment(name: "Alice", day: "Fri", place: "BeiJing")

如果要在引用类型中实现原型模式,需要实现NSCoping协议。

本文中使用的SportStore应用的初始模板在这里 github.com/RockyAo/Des…

本文中示例代码也在这里(02文件夹下) github.com/RockyAo/Des…