加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

swift-原型模式

发布时间:2020-12-14 05:58:00 所属栏目:百科 来源:网络整理
导读:设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。GoF提出了23种设计模式,本系列将使用Swift语言来实现这些设计模式。 概述 通过复制一个已存在的对象来获得一个新的相同类型的对象被称作原型模式,在复制

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。GoF提出了23种设计模式,本系列将使用Swift语言来实现这些设计模式。

概述

通过复制一个已存在的对象来获得一个新的相同类型的对象被称作原型模式,在复制的过程中不需要关心被复制对象实现的接口或者类型。

原型模式Prototype具有如下优点:

  • 隐藏了创建对象的实现细节

  • 复制操作不受子类构造器改变影响

  • 避免了重复创建对象产生的大量代码

简单来说,原型模式分为以下两种:

  • 简单拷贝

  • 登记拷贝

没有使用原型Prototype的拷贝代码是怎样的呢?我们需要通过访问

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
classPet:NSObject{
var name:String?
var weigh:Float?
init(name:String,weigh:Float){...}
}
classPerson:NSObject{
var pet:Pet?
var name:String?
var height:Float?
init(name:String,height:Float,pet:Pet){...}
}
letpet=Pet(name: "球球" ,weigh:2.0)
letauthor=Person(name: "林欣达" ,height:173,pet:pet)
var persons:[Person]=[Person]()
for _ in 0...9{
persons.append(Person(name:author.name!,height:author.height!,pet:Pet(name:pet.name,weigh:pet.weigh)))
}

简单形式拷贝

通过声明一个Cloning协议来为需求方提供完全拷贝的方案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
protocolCloning{
funcclone()->AnyObject
}
classPet:NSObject,Cloning{
funcclone()->AnyObject{
return Pet(name:name!,weigh:weigh!)
}
}
classPerson:NSObject,Cloning{
funcclone()->AnyObject{
return Person(name:name!,height:height!pet:pet?.clone()as!Pet)
}
}
letauthor=Person(name: "林欣达" ,pet:Pet(name: "球球" ,weigh:2.0))
var persons:[Person]=[Person]()
for _ in 0...9{
persons.append(author.clone())
}

简单点来说,原型模式在iOS开发中就是NSCopying协议,通过实现这个协议完成对象和其成员对象的完全内存拷贝,也可以称为深拷贝。从这个角度而言,原型模式Prototype就是深拷贝的理论化

登记拷贝

登记拷贝实际上就是在简单拷贝的基础之上对这些clone对象进行管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
classCloneManager:NSObject{
staticletsharedManager=CloneManager()
private var mapper:[String:Cloning]=[String:Cloning]()
privateoverrideinit(){
super .init()
}
funcstore(prototype:Cloning, for identifier:String){
mapper[identifier]=prototype
}
funcprototype( for identifier:String)->Cloning?{
return mapper[identifier]
}
funcremove( with identifier:String){
mapper[identifier]=nil
}
}
classViewController:UIViewController{
overridefuncviewDidLoad(){
letclone=author.clone()
CloneManager.sharedManager.store(clone, "CloneInstance" )
letstoredClone=CloneManager.sharedManager.prototype( for : "CloneInstance" )
if clone==storedClone{
print( "Storesuccess" )
}
if clone!=author{
print( "Youcreateacopyinstanceofauthor" )
}
CloneManager.sharedManager.remove( with : "CloneInstance" )
assert(CloneManager.sharedManager.prototype( for : "CloneInstance" )==nil)
}
}

总结

原型模式Prototype将对象和其成员对象的拷贝过程隐藏起来,只提供了一个简单的接口提供我们获取拷贝后的对象,是一种优雅而强大的设计。使用原型模式需要注意实现Cloning的对象其成员对象也应该遵循这个协议提供简单的拷贝接口。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读