設計模式學習-原型模式

敖老黑發表於2017-12-20

原型模式相關概念

原型模式通過克隆已有的物件來建立新的物件,已有的物件即為原型.

使用這個模式的好處

  • 隱藏了建立物件的程式碼,即程式碼對於使用它的元件是不可見的
  • 避免重複初始化過程。
  • 避免對類别範本的依賴

什麼時候使用 當需要建立新的例項,但又不想依賴類的構造方法。可以使用這個模式

  • 深拷貝和淺拷貝
  • 程式碼結構混亂(必須暴露原型物件,用於拷貝)

原型模式例子:

將一個值型別賦值給變數的時候,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…

相關文章