iOS 开发之 设计模式【一】原型模式 (Prototype pattern)
原型模式(Prototype pattern):
定义:使用原型实例指定创建对象的种类,并通过复制这个原型创建对象。也可以理解为模板,在创建新对象的时候,按照模板的方法来复制,避免重复造轮子。
简单来说,就是根据这个原型创建新的对象,而且不需要知道任何创建的细节。例如,在生物学中,有“细胞分裂”,细胞在一定条件下从一个分裂成两个,再由 2 个分裂成 4 个.......。分裂出来的细胞是基于原始的细胞(原型),这种原始的细胞决定了分裂出来的细胞结构。这种分裂过程,称为“原型模式”。在 TableViewCell 重用机制中,也可以理解为使用原型模式,使用 cell 模板来复制 cell。
UML 图如下:
应用场景:
当一个类的组成比较复杂时,例如包含多个组件或自定义属性时,可以直接复制当前对象;
当对象间的区别不大时,只有几个属性不同,可以考虑使用原型模式。
优点:使用原型模式可以避免内存较大开销的初始化创建动作。不用重新初始化对象,而是动态的获取对象运行时的状态。
实现:
在 iOS 中使用原型模式,在多数情况下属于深拷贝的行为,需要遵循 NSCoding 协议。
深拷贝(mutableCopy
):开辟内存,实现真正的内存复制;即拷贝后对象值相同,但地址不同。
浅拷贝(Copy):只复制指针,堆内存不变。即拷贝后对象值相同,地址也相同。只复制了指针值,并没有复制指针指向的资源(即没有创建指针指向资源的副本),复制后原有指针和新指针共享同一块内存。
对于系统中已经实现的同时支持NSCopying协议和NSMutableCopying协议的NSString、NSDictionary等,copy总是返回不可变副本,mutableCopy总是返回可变副本。
对于浅拷贝,想要使用 copy,需要遵守 NSCopying 协议,并且实现 copyWithZone: 方法。
对于深拷贝,想要使用 mutableCopy,需要遵守 NSMutableCopying 协议,并且实现 mutableCopyWithZone: 方法。
/** Prototype Pattern 原型模式 **/
PrototypePerson *person = [[PrototypePerson alloc] init];
person.name = @"张三";
person.gender = PrototypeGenderMale;
person.age = ;
person.height = 176.4; //深拷贝
PrototypePerson *person1 = [person copy];
NSLog(@"deepCopy name = %@ age = %lu", person1.name, person1.age);
//浅拷贝
PrototypePerson *person2 = person;
NSLog(@"shallowCopy name = %@ age=%lu", person2.name, person2.age);
person2.name = @"李四";
person2.age = ;
NSLog(@"deepCopy person1 name = %@ age = %lu", person1.name, person1.age);
NSLog(@"shallowCopy person name = %@ age = %lu", person.name, person.age);
根据结果可知,对于浅拷贝的对象,改变对象值,影响原型,而不对深拷贝的值有影响
代码链接:https://github.com/zhangtibin/DesignModelProject
iOS 开发之 设计模式【一】原型模式 (Prototype pattern)的更多相关文章
- 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)
原文:乐在其中设计模式(C#) - 原型模式(Prototype Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:weba ...
- 二十四种设计模式:原型模式(Prototype Pattern)
原型模式(Prototype Pattern) 介绍用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象.示例有一个Message实体类,现在要克隆它. MessageModel usin ...
- python 设计模式之原型模式 Prototype Pattern
#引入 例子1: 孙悟空拔下一嘬猴毛,轻轻一吹就会变出好多的孙悟空来. 例子2:寄个快递下面是一个邮寄快递的场景:“给我寄个快递.”顾客说.“寄往什么地方?寄给……?”你问.“和上次差不多一样,只是邮 ...
- 【UE4 设计模式】原型模式 Prototype Pattern
概述 描述 使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.如孙悟空猴毛分身.鸣人影之分身.剑光分化.无限剑制 原型模式是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象, ...
- 设计模式系列之原型模式(Prototype Pattern)——对象的克隆
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- Net设计模式实例之原型模式( Prototype Pattern)
一.原型模式简介(Brief Introduction) 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. Specify the kin ...
- 【设计模式】原型模式 Pototype Pattern
前面讲了创建一个对象实例的方法单例模式Singleton Pattern, 创造多个产品的工厂模式(简单工厂模式 Simple Factory Pattern, 工厂方法模式 FactoryMothe ...
- php原型模式(prototype pattern)
练练练,计划上午练完创建型设计模式. <?php /* The prototype pattern replicates other objects by use of cloning. Wha ...
- 设计模式 笔记 原型模式 prototype
//---------------------------15/04/07---------------------------- //prototype 原型模式--对象创建型模式 /* 1:意图: ...
- 2.6 《硬啃设计模式》第8章 复制不是很难 - 原型模式(Prototype Pattern)
案例: 某即时战略游戏,你训练出来各种很强的战士. 为了增加游戏的可玩性,增加了一种复制魔法.实施该魔法,可以复制任意的战士. 你会怎样考虑这个设计? 在继续阅读之前,请先认真思考并写出你的设计,这样 ...
随机推荐
- C/C++内存四区
内存模型图 32位CPU可寻址4G线性空间,每个进程都有各自独立的4G逻辑地址,其中0~3G是用户态空间,3~4G是内核空间,不同进程相同的逻辑地址会映射到不同的物理地址中.其逻辑地址其划分如下: 各 ...
- 使用SqlDataReader的查询操作
原创weixin_42430576 发布于2019-01-31 18:49:41 阅读数 762 收藏 展开 using System; using System.Collections.Gener ...
- Bugku-CTF分析篇-flag被盗(flag被盗,赶紧溯源!)
flag被盗 flag被盗,赶紧溯源!
- bugku flag在index里
原题内容: http://120.24.86.145:8005/post/ Mark一下这道题,前前后后弄了两个多小时,翻了一下别的博主的wp感觉还是讲的太粗了,这里总结下自己的理解: 首先打开这道题 ...
- mescroll.js简单的上拉加载、下拉刷新插件,带完整注释
声明:本插件模仿自mescroll.js,随手所作,仅以注释提供思路,只实现了部分效果,且没有考虑兼容,有兴趣的朋友随意一看.api大家可参考mescroll.js API汇总一文. demo:点我下 ...
- mybatis--多对一关联
(1)首先,创建数据库mybatismanytoone并插入数据 create database mybatismanytoone; use mybatismanytoone; create tabl ...
- Go性能调优
文章引用自 Go性能调优 在计算机性能调试领域里,profiling 是指对应用程序的画像,画像就是应用程序使用 CPU 和内存的情况. Go语言是一个对性能特别看重的语言,因此语言中自带了 pr ...
- Hello 2020D(多重集)
如果有一对时间对在某一场馆有时间重合而这一对时间对在另一场馆没有时间重合,则输出NO,否则输出YES. #define HAVE_STRUCT_TIMESPEC #include<bits/st ...
- CSS学习(2)Id和Class选择器
id 选择器 id 选择器可以为标有特定 id 的 HTML 元素指定特定的样式. HTML元素以id属性来设置id选择器,CSS 中 id 选择器以 "#" 来定义. 以下的样式 ...
- mysql 隔离性与隔离级别
提到事务,你肯定不陌生,和数据库打交道的时候,我们总是会用到事务.最经典的例子就是转账,你要给朋友小王转 100 块钱,而此时你的银行卡只有 100 块钱. 转账过程具体到程序里会有一系列的操作,比如 ...