OC编程之道-创建对象之原型模式
一 什么是原型模式?(what)
有些对象的创建代价过大或过于复杂,要是可以重建相同的对象并作轻微的改动,事情会容易的多(效率变高)。典型的例子是复制组合结构(eg树形结构),从零开始构建一个树型组合体非常困难。可以通过轻微的改动重用已有的对象,以适应程序中的特定情况。
原型模式属于创建性设计模式,通过拷贝的方式快速创建一个对象,这里拷贝的方式有两种1)浅拷贝2)深拷贝。
二 何时使用原型模式?(where)
1要实例化的类要在运行时才确定。
2很多相关的类,其行为略有不同,而且主要差异在于内部属性,如名称、图像等。
3需要使用组合(树型)对象作为其他东西的基础,例如,使用组合对象作为组件来构建另一个组合对象。
4需创建的对象应独立于其类型与创建方式。?
5不想要与产品层次相对应的工厂层次。?
注意:不管什么对象,只要复制自身比手工实例化要好,都可以是原型对象。
三 cocoa touch框架中的对象复制
NSObject有一个实例方法叫做(id)copy,默认的copy方法调用[self copyWithZone:nil]。
NSObject协议没有声明copy方法。
NSCopying协议,声明了copyWithZone方法。
当NSObject型的接收器收到copy消息时,NSObject会一次向其采用了NSCopying协议的子类发送消息。
四 具体实现原型模式?(how)
Mark<NSObject>协议
属性:color,size,location,count,id<mark>lastChild
方法:-(id)copy,addMark:mark,removeMark:mark,childMarkAtIndex:index;
Vertex对象用于组成线条,并不包含颜色、大小等其他信息。
Vertex:NSObject <Mark,NSCopying>
属性:同上,location_
方法:同上(除了copy方法),initWithLocation:location,copyWithZone:zone;
避免编译警告。解释在编程之道的p42页。
- (id)copyWithZone:(NSZone *)zone
{
Vertex *vertexCopy =[[[self class]allocWithZone:zone]initWithLocation:location_];
return vertexCopy;
}
Dot包含颜色与大小,以表示这个点
Dot:Vertex
属性:color,size
方法:copyWithZone:(NSZone *)zone;
Stroke:NSObject <Mark,NSCopying>
五 使用
假定用户选择了一个叫做selectedMark的Mark实例作为图样模板。
id <Mark> patternTemplate = [selecteMark copy];
[templateArray addObject:patternTemplate];
当用户要把先前保存的一个图样模板应用到CanvasView的时候
id <Mark> patternClone = [templateArray objectAtIndex:patternIndex];
[currentMark addMark:patternClone];
[canvasView setMark:currentMark];
[canvasView setNeedsDisplay];
OC编程之道-创建对象之原型模式的更多相关文章
- OC编程之道-创建对象之生成器模式
生成器模式也叫建造者模式,一般是用来构造复杂对象的一种模式.client(客户)-director(指导者)-builder(构造者)-product(产品). 生成器模式能帮助构建设计部件与表现的各 ...
- OC编程之道-创建对象之抽象工厂方法
定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类. <AbstractProductA> <AbstractProductB> <Ab ...
- OC编程之道-创建对象之工厂方法
一 何为工厂方法模式?(what) 定义创建对象的接口,让子类决定实例化哪一个类,工厂方法是的一个类的实例化延迟到其子类. 工厂方法创建的对象拥有一组共同的行为,所以往类层次结构中引入新的具体产品并不 ...
- OC编程之道-创建对象之单例模式
一 何为单例singleton模式?(what) 保证一个类只有一个实例,并提供一个访问它的全局访问点. 二 何时使用单例模式?(where) 1类只能有一个实例,而且必须从一个为人熟知的访问点对其访 ...
- js面向对象的程序设计 --- 中篇(创建对象) 之 原型模式
·原型模式 我们创建的每一个函数都由一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有 实例共享的属性和方法. 如果按照字面意思来理解,那 ...
- javascript创建对象之原型模式(三)
少废话,先上代码: function Human() { } Human.prototype.name = "成吉思汗"; Human.prototype.sex = " ...
- OC编程之道-接口适配之适配器
已有的类与新的接口之间不兼容的问题相当普遍,人们已为它找到了一个解决方案.这个解决方案就是适配器. 1 何为适配器 what 适配器的主要作用是把被适配者的行为传递给管道另一端的客户端. 将一个类的接 ...
- JS创建对象之原型模式
一.原型对象 只要创建了一个新函数,就会根据一组特定的规则为该函数创建一个prototype属性,这个属性指向函数的原型对象:在默认情况下,所有原型对象都会 自动获得一个constructor(构造函 ...
- 设计模式 之 原型模式(ProtoType)
什么时原型模式 或 原型模式的定义: 用原型实例来指定创建对象的种类,并通过拷贝这些原型创建新的对象. 原型模式的特点: 1),它是面向接口编程, 2),原型模式的新对象是对原型实例的一个克隆 ...
随机推荐
- centos7.0 安装字体库
最近在centos7.0下用itextpdf将word文档转成pdf时出现字体丢失的情况.网上找了很多资料,各式各样的原因和解决方法.后来经过一番测试发现是centos7.0 minimal没有安装相 ...
- 【跟着子迟品 underscore】常用类型判断以及一些有用的工具方法
Why underscore 最近开始看 underscore.js 源码,并将 underscore.js 源码解读 放在了我的 2016 计划中. 阅读一些著名框架类库的源码,就好像和一个个大师对 ...
- docfx开源啦
废话不多说了,直接上地址: 源代码: https://github.com/dotnet/docfx 文档: http://dotnet.github.io/docfx/ clone git clon ...
- 在哪可以Sigmaplot 13下载免费版的
SigmaPlot是一款科学的数据分析和绘图软件,可以进行精密绘图.数据分析.自动化管理数据和创建网络图表,具备制作和发行品质图表的水平,该软件被广泛地运用在多个领域.现今SigmaPlot软件日益受 ...
- 解决:MIUI 8应用商店下载不了软件 APP
MIUI 8应用商店下载不了软件,是什么原因呢? 原因是:刷了国际版的MIUI,然后又刷回国内的MIUI,刷机时数据没有清理干净. 解决办法:使用RE管理器或者其他第三方可以编辑系统文件的文件管理器, ...
- SHOI2016游记&滚粗记&酱油记
Day0 学校刚期中考完,全科血崩,感觉这次真要考不到一本线了tat 晚上写了个可持久化trie的题,也懒得敲板子(上个礼拜都敲过了),就碎叫了 Day1 上午起床吃饭水群看球,吃完中饭就去考场了. ...
- angular作用域分析
angualr作用域 Scope 控制器作用域的继承特性Ⅰ 绑定的数据是变量 单向隔离(兄弟之间互不影响,父子之间单向继承) 父级控制器的数据绑定会影响到子级控制器 前提是子控制器内没有绑定数据 单向 ...
- Leetcode 377. Combination Sum IV
Given an integer array with all positive numbers and no duplicates, find the number of possible comb ...
- POJ3249:Test for Job
传送门 很简单的一道题,被卡了几次,死于答案非法统计. 题意是求图里的一条最长的路径满足起点的入度和终点的出度都是0,而且图是DAG. 既然是DAG求最长路,DP即可.搞出拓扑序,逆序DP,然后统计所 ...
- OSI参考模型及各层功能,TCP与UDP的区别
OSI参考模型:ISO/IEC 7498标准定义了网络互联的7层结构模型,即开放系统互连参考模型. OSI参考模型定义了开放系统的层次结构.层次之间的相互关系,以及各层所包括的可能的服务.OSI的服务 ...