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

    // 学生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里面出现了许多的属性,太少的话,就没有必要了。

05-07 15:50