原型模式相關概念
原型模式通過克隆已有的物件來建立新的物件,已有的物件即為原型.
使用這個模式的好處
- 隱藏了建立物件的程式碼,即程式碼對於使用它的元件是不可見的
- 避免重複初始化過程。
- 避免對類别範本的依賴
什麼時候使用 當需要建立新的例項,但又不想依賴類的構造方法。可以使用這個模式
坑
- 深拷貝和淺拷貝
- 程式碼結構混亂(必須暴露原型物件,用於拷貝)
原型模式例子:
將一個值型別賦值給變數的時候,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…