设计模式学习-原型模式

原型模式相关概念

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

使用这个模式的好处

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

什么时候使用

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

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

原型模式例子:

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
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。并修改一些值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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进行了一次深拷贝。

1
2
3
4
5
6
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应用的初始模板在这里 https://github.com/RockyAo/DesignPatternerLearn

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