原型模式:大部分重复,只有一小部分不同的情况下,为了代码清晰和避免麻烦,用原型模式,会更方便一点

    // 学生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原型模式的更多相关文章

  1. iOS设计模式-原型模式

    | 导语 定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 通过深复制(克隆.拷贝)一个指定类型的对象来创建更多同类型的对象.这个指定的对象可被称为“原型”对象,也就是通过复制原型 ...

  2. IOS设计模式浅析之原型模式(Prototype)

    原型模式的定义 “使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象”.最初的定义出现于<设计模式>(Addison-Wesley,1994). 简单来理解就是根据这个原型创建 ...

  3. iOS 开发之 设计模式【一】原型模式 (Prototype pattern)

    原型模式(Prototype pattern): 定义:使用原型实例指定创建对象的种类,并通过复制这个原型创建对象.也可以理解为模板,在创建新对象的时候,按照模板的方法来复制,避免重复造轮子. 简单来 ...

  4. iOS设计模式之原型模式

    原型模式 基本理解 原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节 ...

  5. iOS架构模式浅析

    这是以前旧博客在13年规划写的一个系列,写了一部分内容,还没有完成.现在重新整理编写.计划从基础知识六大设计原则.设计模式中类的关系开始,然后会对iOS开发中的常用架构模式进行介绍,最后对GoF的23 ...

  6. 设计模式 笔记 原型模式 prototype

    //---------------------------15/04/07---------------------------- //prototype 原型模式--对象创建型模式 /* 1:意图: ...

  7. 设计模式之原型模式(深入理解OC中的NSCopying协议以及浅拷贝、深拷贝)

    原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.原型模式其实就是从一个对象再创建另一个可定制的对象,而且不需知道任何创建的细节. 比如说,有一个Person类,有firstN ...

  8. 设计模式(六)原型模式(Prototype Pattern)

    一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在 ...

  9. PHP 原型模式

    原型模式:原型模式是先创建好一个原型对象,然后通过拷贝原型对象来创建新的对象.适用于大对象的创建,因为创建一个大对象需要很大的开销,如果每次new就会消耗很大,原型模式仅需内存拷贝即可.也可以用作动态 ...

随机推荐

  1. k8s dns 服务安装配置说明

    1. 提前条件 安装k8s 集群 2.  dns  安装配置 安装方式: 使用controller  service controller  脚本: 基于官方改动 apiVersion: v1 kin ...

  2. [转]面向过程的分析(POA),和面向对象的分析(OOA)

    欢迎转载本文,转载地址: http://www.juliantec.info/articles/basic-concept/poa-and-ooa.html 软件开发方法论概述 在60年代的软件开发行 ...

  3. VMware安装centos虚拟机

    vm中安装虚拟机,步骤,图片截取 VM中 --> 文件 --> 新建虚拟机 此处若是提示CPU不支持虚拟机安装 重启计算机,进入BIOS,修改cpu配置 点击next 下一步 .... 等 ...

  4. VR外包团队:长年承接VR虚拟现实外包(应用、游戏、视频、漫游等)

    北京动点飞扬软件,从事外包业务五年,长年承接全景VR视频,全景普通视频外包. 以下是全景VR视频案例(可操作,人不动景物不动,人移动,景物跟随) 欢迎联系我们QQ:372900288 TEL:1391 ...

  5. matlab 车牌分割的算法

    function Touying(g) f=rgb2gray(g); % [m n]=size(f); [row col]=size(f); % T=graythresh(f) % T=T*255 % ...

  6. org.apache.catalina.LifecycleException tomcat 启动 maven 处处都是坑!!!

    问题1:tomcat不识别maven工程解决办法:project右击->Properties->Project Facets,选择Dynamic Web Module及其版本(tomcat ...

  7. day4 函数

    面向对象:-->类-->class面向过程:-->过程-->def函数式编程:-->函数-->def 函数是逻辑结构化和过程化的一种编程方法 使用函数的三大优点:减 ...

  8. 使用Xamarin.Forms平台开发移动应用指南

    下载书:链接: http://pan.baidu.com/s/1c29H9KG 密码: 7esm 注:捣鼓虚拟机把Hyper-V关闭,后来Xamarin搞挂了,所以暂停翻译. 第1章 Xamarin. ...

  9. 解决Dropbox无法连接的问题

    同步共享服务Dropbox从6月18日开始再次遭到封锁,原因是DNS污染.Dropbox上次在2010年5月曾遭到IP封锁和网址关键字过 滤,2012年5月除文件外链功能外其它功能可正常访问:2014 ...

  10. mybatis 中${}和#{}区别

    用#传入参数是,sql语句解析是会加上"",比如  select * from table where name = #{name} ,传入的name为小李,那么最后打印出来的就是 ...