1.原型

原型设计模式所谓原型设计模式,其实就是对象复制,这个特性在所有语言基本上都是存在的。

我们知道在OC中,对象赋值其实是对对象的引用复制,其实就是相当于C语言中的指针。创建了一个新的变量,但是还是指向的同一块内存地址。

所以一旦一个引用改变了该对象的属性,那么其他指向该对象的引用全部都会发生变化。

有时候我们并不像要这样做,我们希望重新创建一个和赋值对象一模一样的一个对象。比如我们写游戏的时候创建了一个enemy对象并对其复杂的行走路径进行了自定义,此时我们想要在创建一个。但是再次创建时,所有创建过程都要重新再写一遍,这样非常的不方便。再比如说我们创建了一个树形结构,如果想重新一个同样的对象,代价会非常大,此时我们就需要用到原型设计模式来对对象进行复制。

何时使用

1.需要创建的对象应独立于其类型与创建方式。

  也就是说我们想要的对象并不能够直接通过初始化函数来创建出来,其创建过程不具有普遍性且复杂。

2.要实例化类是在运行时决定的。

  在编写代码的时候并不知道哪种对象会被创建出来,其内部的结构如何复杂(例如:复杂程度取决于用户的操作)

3.不想要与产品层次相对应的工厂层次

  不通过工厂方法或者抽象工厂来控制产品的创建过程,想要直接复制对象

4.不同类的实例间的差异仅是状态的若干组合。因此复制相应数量的原型比手工实例化更加方便

5.类不容易创建,比如每个组件可把其他组件作为子节点的组合对象。复制已有的组合对象并对副本进行修改会更加容易。

  如果内部结构复杂,不容易重现。

以下两种常见的使用场景

1.有很多相关的类,其行为略有不同,而且主要差异在于内部属性,如名称、图像等;

2.需要使用组合(树形)对象作为其他东西的基础,例如,使用组合对象作为组件来构建另一个组合对象。

浅复制与深复制

浅复制:只复制指针而不对内部对象进行复制。

深复制:即复制指针,又为内部对象进行单独复制重新开辟内存空间。

OC对象复制

OC的深复制需要实现NSCopying协议及其方法

-(id)copyWithZone:(NSZone *)zone。

NSObject有一个实例方法是(id)copy。

默认copy方法调用[self copy withZone:nil]

对于采纳了NSCopying协议的子类,需要实现这个方法,否则将引发异常。iOS中,这个方法保持新的副本对象,然后将其返回。

多数情况下深复制并不复杂,思路就是复制必须的成员变量与资源,传给此类的新实例,然后返回这个新类型。

demo

  1. Prototype是实现NSCopying协议,并且实现了(id)copyWithZone:(NSZone *)zone方法的类。
  1. 1
  2. 2 Prototype *type1 = [Prototype new];
  3. 3 type1.name = @"123";
  4. 4 Prototype *type2 = type1;
  5. 5 if(type1.name == type2.name)
  6. 6 NSLog(@"%p",&type1);
  7. 7 Prototype *type3 = [type1 copy];
  8. 8 if(type1.name == type3.name)
  9. 9 NSLog(@"%p",&type3);
  10. 10 type1.name =@"456";
  11. 11 NSLog(@"%@ %@",type2.name , type3.name);
  12. 12
  13. 13 /*
  14. 14 2015-07-19 21:15:13.618 Prototype[31679:8185916] 0x7fff5fbff7e8
  15. 15 2015-07-19 21:15:13.619 Prototype[31679:8185916] 0x7fff5fbff7d8
  16. 16 2015-07-19 21:15:13.619 Prototype[31679:8185916] 456 123
  17. 17 */

可以看出来,type1属性变化时,浅复制的type2也跟着变,但是type3还是保留原值证明其为深复制。

Objective-C设计模式——原型Prototype(对象创建)的更多相关文章

  1. 关于构造函数和原型prototype对象的理解

    构造函数     1.什么是构造函数 构造函数,主要用于对象创建的初始化,和new运算符一起用于创建对象,一个类可以有多个构造函数,因为函数名相同,所以只能通过参数的个数和类型不同进行区分,即构造函数 ...

  2. JavaScript 原型和对象创建底层原理

    1. prototype/__proto__/constructor JS原型链和继承网上已经烂大街了,5毛可以买一堆,这里只提一下: constructor:普通对象和函数对象都有,指向创建它的函数 ...

  3. [js高手之路]一步步图解javascript的原型(prototype)对象,原型链

    我们接着上文继续,我们通过原型方式,解决了多个实例的方法共享问题,接下来,我们就来搞清楚原型(prototype),原型链的来龙去脉. function CreateObj(uName) { this ...

  4. ProtoType(原型)-对象创建型模式

    1.意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 2.动机 通过拷贝或者“克隆”一个类的实例来创建新的实例. 3.适用性 当一个系统应该独立于它的产品创建.构成和表示时,要使 ...

  5. 设计模式--原型(Prototype)模式

    写这些也许有人认为“为了模式而模式”.Insus.NET所想到的,每个大师成为大师之前,也许都得这样做. 走路,从小就开始学,直至现在,谁还不是为了走路而走路?一直重复着...... 很多人没有分享自 ...

  6. 设计模式-原型(prototype)

     一.概念 用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 二.模式动机 当已有一个对像,暂且称之为原型对象,需要一个新的对像,该对像和已有的原型对像具有相同的类型,且里面的属性大部分 ...

  7. 克隆复制可使用原型( Prototype)设计模式

    今天有学习设计模式的原型(Prototype)<设计模式--原型(Prototype)模式>http://www.cnblogs.com/insus/p/4152773.html .为了加 ...

  8. 设计模式---对象创建模式之原型模式(prototype)

    一:概念 原型模式(Prototype Pattern) 实际上就是动态抽取当前对象运行时的状态 Prototype模式是一种对象创建型模式,它采取复制原型对象的方法来创建对象的实例.使用Protot ...

  9. 设计模式(四)原型模式Prototype(创建型)

      设计模式(四)原型模式Prototype(创建型) 1.   概述 我们都知道,创建型模式一般是用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象 ...

随机推荐

  1. 浅析C#基于TCP协议的SCOKET通信

    TCP协议是一个基本的网络协议,基本上所有的网络服务都是基于TCP协议的,如HTTP,FTP等等,所以要了解网络编程就必须了解基于TCP协议的编程.然而TCP协议是一个庞杂的体系,要彻底的弄清楚它的实 ...

  2. 架构探险——第二章(为web应用添加业务功能)

    第二章不使用框架完成了自己的Web应用. 重点: 服务层的完善优化过程,思路 在看这一段的时候引起了无数次的共鸣.相信大家在开始接触Java Web的时候,都做过类似的封装和优化. 第一版 在Serv ...

  3. JAVA学习第五十七课 — IO流(十一)

    一.管道流 PipedInputStream 和 PipedOutPutStream 输入和输出能够直接进行连接.结合线程使用 管道流,顾名思义,写一个读一个.连成一个管子 API文档:管道输入流应该 ...

  4. TCP/IP数据包结构具体解释

    [关键词] TCP IP 数据包 结构 具体解释 网络 协议 一般来说,网络编程我们仅仅须要调用一些封装好的函数或者组件就能完毕大部分的工作,可是一些特殊的情况下,就须要深入的理解 网络数据包的结构, ...

  5. IPC——流套接字通信

    Linux进程间通信——使用流套接字 前面说到的进程间的通信,所通信的进程都是在同一台计算机上的,而使用socket进行通信的进程可以是同一台计算机的进程,也是可以是通过网络连接起来的不同计算机上的进 ...

  6. 表ADT

    表一般不用简单数组来实现,通常将其实现为链表.在链表中要不要使用表头则属于个人兴趣问题.在下面的例程中我们都使用表头. 按照C的约定,作为类型的List(表)和Position(位置)以及函数的原型都 ...

  7. 什么是mysql中的元数据

    一:什么是元数据? 所谓元数据,就是表示数据的数据,这些数据五花八门,总之,只要不是我们存储到数据库里的数据,大多都可以理解为元数据.描述数据库的任何数据—作为数据库内容的对立面—是元数据.因此,列名 ...

  8. yii2-admin 插件使用简要教程

    yii2的访问权限默认是由自带的rbac组件在管理,需要自己编写相应的规则去实现权限管理,无图形界面.yii2-admin是将rbac的管理可视化,只需要点几下鼠标就能设置好简单的规则. 本教程中软件 ...

  9. LeetCode1 Two Sum

    题目 :Given an array of integers, return indices of the two numbers such that they add up to a specifi ...

  10. Balanced Lineup 倍增思想到ST表RMQ

      Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 36864   Accepted: 172 ...