原型模式(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)的更多相关文章

  1. 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)

    原文:乐在其中设计模式(C#) - 原型模式(Prototype Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:weba ...

  2. 二十四种设计模式:原型模式(Prototype Pattern)

    原型模式(Prototype Pattern) 介绍用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象.示例有一个Message实体类,现在要克隆它. MessageModel usin ...

  3. python 设计模式之原型模式 Prototype Pattern

    #引入 例子1: 孙悟空拔下一嘬猴毛,轻轻一吹就会变出好多的孙悟空来. 例子2:寄个快递下面是一个邮寄快递的场景:“给我寄个快递.”顾客说.“寄往什么地方?寄给……?”你问.“和上次差不多一样,只是邮 ...

  4. 【UE4 设计模式】原型模式 Prototype Pattern

    概述 描述 使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.如孙悟空猴毛分身.鸣人影之分身.剑光分化.无限剑制 原型模式是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象, ...

  5. 设计模式系列之原型模式(Prototype Pattern)——对象的克隆

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  6. Net设计模式实例之原型模式( Prototype Pattern)

    一.原型模式简介(Brief Introduction) 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. Specify the kin ...

  7. 【设计模式】原型模式 Pototype Pattern

    前面讲了创建一个对象实例的方法单例模式Singleton Pattern, 创造多个产品的工厂模式(简单工厂模式 Simple Factory Pattern, 工厂方法模式 FactoryMothe ...

  8. php原型模式(prototype pattern)

    练练练,计划上午练完创建型设计模式. <?php /* The prototype pattern replicates other objects by use of cloning. Wha ...

  9. 设计模式 笔记 原型模式 prototype

    //---------------------------15/04/07---------------------------- //prototype 原型模式--对象创建型模式 /* 1:意图: ...

  10. 2.6 《硬啃设计模式》第8章 复制不是很难 - 原型模式(Prototype Pattern)

    案例: 某即时战略游戏,你训练出来各种很强的战士. 为了增加游戏的可玩性,增加了一种复制魔法.实施该魔法,可以复制任意的战士. 你会怎样考虑这个设计? 在继续阅读之前,请先认真思考并写出你的设计,这样 ...

随机推荐

  1. springboot10(docker)

    一 Docker 1 what's the Docker? ​ Docker是一个开源的应用容器引擎,轻量级容器技术. ​ Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器 ...

  2. UNICODE编码UTF-16 中的Endian(FE FF) 和 Little Endian(FF FE)

    从网上找到的两篇不错的文章,由于被网上多处转载,所以不知道源处,未能注明出处,希望作者见谅,如有意见请发信给我,谢谢! 第一篇很清晰. 介绍Unicode之前,首先要讲解一些基础知识.虽然跟Unico ...

  3. Mac下ssh远程无密码登录

    入手Mac,对很多工具的使用都不太熟悉,这不,做web开发,登录远程服务器非常繁琐,想要去掉输入密码这个环节,找到网友的分享如下: http://www.cnblogs.com/shuaiwhu/ar ...

  4. Spring-Bean的后置处理器

    Spring——Bean 后置处理器 Bean 后置处理器允许在调用初始化方法前后对 Bean 进行额外的处理. BeanPostProcessor 接口定义回调方法,你可以实现该方法来提供自己的实例 ...

  5. vs rdlc 设置Tablix 在新页面重复表头

    设置方法: 1.选中Tablix控件 2.点开三角形 3.选择高级模式 4.在行组 下 选择静态,然后看右边的属性 5.将属性设置为如下 就可以让Tablix控件实现在新页中带表头

  6. ALSA driver--PCM Interrupt handle

    PCM 中断处理函数的主要作用是用来更新buffer position. 在PCM的interrupt handle里面通过snd_pcm_period_elapsed来通知alsa-core buf ...

  7. 动态链接--运行时加载dlopen

    前面我们在编译可执行文件时,如果可执行文件要依赖某个so.必须要通过-L指定so路径,并且-l指定so名字. 而且在可执行文件运行时,要先加载so的load部分到进程地址空间. 有一种方式可以在编译时 ...

  8. UVA 10795 A Different Task(模拟)

    题目链接:https://vjudge.net/problem/UVA-10795 一道比较有思维含量的一道题: 注意一种分治的思想和“除了柱子x和柱子y之外的那个柱子”编号的问题. 首先在初始局面和 ...

  9. selenium+python自动化用例登陆界面模板

    一.基本逻辑 1.自动填写用户名和密码登录成功后跳转到相应页面 2.验证相应页面的url与给定的url是否一致,如果一致则测试通过,如果不一致则不通过 二.以jenkins登陆界面为例,代码如下 fr ...

  10. 基于Aspectj表达式配置的Spring AOP

    AOP(Aspect-Oriented Programming, 面向切面编程):是一种新的方法论, 是对传统OOP(Object-Oriented Programming, 面向对象编程)的补充. ...