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就会消耗很大,原型模式仅需内存拷贝即可.也可以用作动态 ...
随机推荐
- Centos7 修改ssh 默认端口号
第一步.修改/etc/ssh/sshd_config #Port 22 //这行去掉#号 Port 3600 //将端口号改成3600 第二步:在使用SELinux的系统中,需要修改SELinux 使 ...
- DB2 中文排序问题
本地测试库中 代码集: GBK 数据库配置发行版级别 = 0x0c00 数据库发行版级别 = 0x0c00 数据库地域 = CN 数据库代码页 = 1386 数据库代码集 = GBK 数据库国家/地区 ...
- Quartz 线程处理
官网 http://www.quartz-scheduler.net/ 相关的 Log 说明 http://netcommon.sourceforge.net/docs/2.1.0/reference ...
- bzoj1904: Musical Water-fence
找出最高的木块,假设在这块木块上无限加水,就会形成一些水池,然后才向两侧溢出 用并查集维护当前在某个位置使水向左/右流动,水会流向哪个水池或从某一侧溢出浪费,当某个水池满时更新并查集 #include ...
- MySQL使用说明
一.概述 什么是数据库 ? 答:数据的仓库,如:在ATM的示例中我们创建了一个 db 目录,称其为数据库 什么是 MySQL.Oracle.SQLite.Access.MS SQL Server等 ? ...
- strace命令简单用法
strace可以显示一个程序经历的系统调用,接收到的信号等信息. 用法: 1.strace -ff -o output programName 将程序programName的写入output文件中,- ...
- dingding post POST请求
POST请求请在HTTP Header中设置 Content-Type:application/json,否则接口调用失败 获取AccessToken Https请求方式: GET https://o ...
- /etc/profile、/etc/bashrc、~/.bash_profile、~/.bashrc
/etc/profile./etc/bashrc.~/.bash_profile.~/.bashrc很容易混淆,他们之间有什么区别?它们的作用到底是什么?/etc/profile: 用来设置系统环境参 ...
- ALSA 学习小记
对于playback snd_pcm_begin snd_pcm_commit, 貌似 commit给的frame才会使得alsa去把数据填充 转自 http://magodo.github.io/ ...
- Python多线程join的用法
import threading, time def Myjoin(): print 'hello world!' time.sleep(1) for i in range(5): t=threadi ...