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就会消耗很大,原型模式仅需内存拷贝即可.也可以用作动态 ...
随机推荐
- 利用SPM工具运行自己创建的小组件(使用common-model向后台接口请求数据)
步骤如下: 1.安装依赖:spm install -e 2.编译:spm build (编译好的东西会放在trunk-dist里面) 3.发布:spm app -d (会出来一个export端口,一般 ...
- 经验分享:Linux 双网卡SNAT和DNAT映射本地端口出外网
A 机器 网卡1 公网IP网卡2 内网 B 机器网卡1 内网 如果想把公网端口P1 映射为内网B机器端口P2 iptables -t nat -A PREROUTING -d [A公网地址] -p ...
- centos 7安装部署docker
1.centos 7 在windows下通过vm虚拟机安装centos 7: VMware-workstation-full-10.0.3-1895310 centos 7 2.要求 操作系统的内核版 ...
- E 最熟悉的陌生人 (纪念当年就读的梅州市江南高级中学)
最熟悉的陌生人 作者:张慧桥 枪与玫瑰” 负责审讯的兄弟真是好样的,回来后的第四天上午就让黄志深那小子招了出来. 这可真的不容易! 现在公安部对我们审讯工作有很多的规定,其中一条就是不准刑讯逼供,就是 ...
- MySQL使用说明
一.概述 什么是数据库 ? 答:数据的仓库,如:在ATM的示例中我们创建了一个 db 目录,称其为数据库 什么是 MySQL.Oracle.SQLite.Access.MS SQL Server等 ? ...
- 一种扩大View点击范围的方法
Rect rect = new Rect();mBt0.getHitRect(rect); rect.bottom += 400; TouchDelegate touchDelegate = new ...
- 短链(ShortURL)的Java实现
什么叫短链或短址? 就是把长的 URL 转成短的 URL, 现在提供这种服务的有很多公司,我们以google家的 URL shortener 服务: http://goo.gl/ 为例. 任何长网址都 ...
- [platform]Device和Driver注册顺序
1. 设备和驱动注册,无论谁先谁后,都可以通过查询总线进行匹配 设备挂接到总线上时,与总线上的所有驱动进行匹配(用bus_type.match进行匹配),如果匹配成功,则调用bus_type.prob ...
- Tomcat启动报错 Could not reserve enough space for object heap
报错信息: Error occurred during initialization of VM Could not reserve enough space for object heap Coul ...
- SQL语句之备份表
SELECT INTO 语句:表示从一个表中选取数据,然后把数据插入另一个表中,常用来备份一张表 1.全表结构备份: SELECT * INTO new_table_name FROM old_tab ...