iOS原型模式
原型模式:大部分重复,只有一小部分不同的情况下,为了代码清晰和避免麻烦,用原型模式,会更方便一点
// 学生1
StudentModel *stu1 = [[StudentModel alloc] init];
stu1.name = @"小王";
stu1.age = @();
stu1.address = @"中关村";
stu1.totalScore = @(); // 学生2
StudentModel *stu2 = [[StudentModel alloc] init];
stu2.name = @"小红";
stu2.age = @();
stu2.address = @"中关村";
stu2.totalScore = @();
例如上面这个,只有名字不同,所以实现copy方法。
#import <Foundation/Foundation.h> @protocol ProtoypeCopyProtocol <NSObject> @required /**
* 复制自己
*
* @return 返回一个拷贝样本
*/
- (id)clone; @end
#import <Foundation/Foundation.h>
#import "ProtoypeCopyProtocol.h" @interface StudentModel : NSObject <ProtoypeCopyProtocol> @property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSNumber *age;
@property (nonatomic, strong) NSString *address;
@property (nonatomic, strong) NSNumber *totalScore; - (id)clone; @end
#import "StudentModel.h" @implementation StudentModel - (id)clone { StudentModel *student = [[[self class] alloc] init]; // 完成复杂操作的所有作业
student.name = self.name;
student.age = self.age;
student.address = self.address;
student.totalScore = self.totalScore; return student;
} @end
重写了clone方法,将复杂的操作写在里面。
关于深拷贝和浅拷贝:
创建BaseCopyObject
#import <Foundation/Foundation.h> @interface BasCopyObject : NSObject <NSCopying> /**
* == 子类不要重载 ==
*
* @return 复制的对象
*/
- (id)copyWithZone:(NSZone *)zone; /**
* == 由子类重载实现 ==
*
* 复制(赋值操作)
*
* @param object 已经复制的对象
*/
- (void)copyOperationWithObject:(id)object; @end
#import "BasCopyObject.h" @implementation BasCopyObject - (id)copyWithZone:(NSZone *)zone { BasCopyObject *copyObject = [[self class] allocWithZone:zone]; // 赋值操作作业
[self copyOperationWithObject:copyObject]; return copyObject;
} - (void)copyOperationWithObject:(id)object { } @end
创建StudentModel,重写copyOperationWithObject方法,继承于StudentModel
#import "BasCopyObject.h" @interface StudentModel : BasCopyObject @property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSNumber *age; @end
#import "StudentModel.h" @implementation StudentModel - (void)copyOperationWithObject:(StudentModel *)object { object.name = self.name;
object.age = self.age;
} @end
在viewDidLoad里面实现:
StudentModel *stu1 = [[StudentModel alloc] init];
stu1.name = @"小明"; StudentModel *stu2 = stu1.copy;
实现浅拷贝,实现原型模式,更方便。可以打印地址,地址不同,已经完全复制了。
在创建ClassModel:
#import "BasCopyObject.h" @interface ClassModel : BasCopyObject @property (nonatomic, strong) NSString *className;
@property (nonatomic, strong) NSArray *students; @end
#import "ClassModel.h" @implementation ClassModel - (void)copyOperationWithObject:(ClassModel *)object { object.className = self.className; // 完成了深拷贝(完整的复制了集合里面的对象)
object.students = [[NSArray alloc] initWithArray:self.students copyItems:YES];
} @end
必须完成上面的这种深拷贝操作才能完成students里面stu的完全拷贝,如果用简单的object.students = self.students;只能完成浅拷贝,当一班的人改变了二班的人也会改变。
以上就是原型模式,适合在一个model里面出现了许多的属性,太少的话,就没有必要了。
iOS原型模式的更多相关文章
- iOS设计模式-原型模式
| 导语 定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 通过深复制(克隆.拷贝)一个指定类型的对象来创建更多同类型的对象.这个指定的对象可被称为“原型”对象,也就是通过复制原型 ...
- IOS设计模式浅析之原型模式(Prototype)
原型模式的定义 “使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象”.最初的定义出现于<设计模式>(Addison-Wesley,1994). 简单来理解就是根据这个原型创建 ...
- iOS 开发之 设计模式【一】原型模式 (Prototype pattern)
原型模式(Prototype pattern): 定义:使用原型实例指定创建对象的种类,并通过复制这个原型创建对象.也可以理解为模板,在创建新对象的时候,按照模板的方法来复制,避免重复造轮子. 简单来 ...
- iOS设计模式之原型模式
原型模式 基本理解 原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节 ...
- iOS架构模式浅析
这是以前旧博客在13年规划写的一个系列,写了一部分内容,还没有完成.现在重新整理编写.计划从基础知识六大设计原则.设计模式中类的关系开始,然后会对iOS开发中的常用架构模式进行介绍,最后对GoF的23 ...
- 设计模式 笔记 原型模式 prototype
//---------------------------15/04/07---------------------------- //prototype 原型模式--对象创建型模式 /* 1:意图: ...
- 设计模式之原型模式(深入理解OC中的NSCopying协议以及浅拷贝、深拷贝)
原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.原型模式其实就是从一个对象再创建另一个可定制的对象,而且不需知道任何创建的细节. 比如说,有一个Person类,有firstN ...
- 设计模式(六)原型模式(Prototype Pattern)
一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在 ...
- PHP 原型模式
原型模式:原型模式是先创建好一个原型对象,然后通过拷贝原型对象来创建新的对象.适用于大对象的创建,因为创建一个大对象需要很大的开销,如果每次new就会消耗很大,原型模式仅需内存拷贝即可.也可以用作动态 ...
随机推荐
- php 一些经常用到的方法
获取当前url地址 /** * 获取当前url * @author Red * @date * @return string */ function getRequestURL() { if (!is ...
- PHP list,explode的使用
PHP list,explode的使用 <?php header("Content-type: text/html; charset=utf-8"); echo " ...
- 多线程下的 Lambda表达式 异步 WebClient 读取程序图标,来作为托盘 图标 logo ico
//读取程序图标,来作为托盘图标this.notifyIcon.Icon = System.Drawing.Icon.ExtractAssociatedIcon(System.Windows.Form ...
- centos虚拟机网络配置
修改IP vi /etc/sysconfig/network-scripts/ifcfg-eth0 ONBOOT=yes BOOTPROTO=dhcp service network restart ...
- cPage分页,asp.net自定义分页,url传值分页,支持datalist、gridview、Repeater等
asp.net分页是最最常用的功能,实现方式也很多,使用不同的控件有不同的分页方式. 下面分享一个我们团队内部使用了多年的一个分页控件cPage,是自己设计编写,没有冗余,简单.快速. cPage,现 ...
- CocoaPods使用详细说明
使用说明: 原文:http://blog.csdn.net/lizhongfu2013/article/details/26384029 http://blog.csdn.net/showhillle ...
- 长年承接AR图像识别项目,关于高速UnityARCam多图问题技术整理
//关于高通ARCameraQCARBehaviour script下 Max Simultneous Image QCARBehaviour script下 Max Simultneous Imag ...
- Creating Classes 创建类
The dojo/_base/declare module is the foundation of class creation within the Dojo Toolkit. declare a ...
- 写出形似QML的C++代码
最开始想出的标题是<Declarative C++ GUI库>,但太标题党了.只写了两行代码,连Demo都算不上,怎么能叫库呢……后来想换掉“库”这个字,但始终找不到合适词来替换.最后还是 ...
- EventBus--介绍
注意: 1,post()方法里面的类型和onEvent()中的类型要一致., 2,订阅者对象中 必须有 onEvent 的 public 方法 ---public void onEvent(O ...