Objective-C 原型模式 -- 简单介绍和使用

先借鉴百科对原型模式的介绍:

定义:

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

Prototype原型模式是一种创建型设计模式,Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。

解决什么问题:

它主要面对的问题是:“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却拥有比较稳定一致的接口。

说直白点就是如果有一个对象很复杂, 重新创建要花费很多的代码或者代价

这个时候可以考虑使用原型模式, 当要创建新实例时通过既有的实例复制一份,再修改不一样的地方值

下面用代码说明如何使用

先创建一个Protocol

 1 #import <Foundation/Foundation.h>
 2
 3 @protocol PrototypeCopyProtocol <NSObject>
 4
 5 @required
 6
 7 /**
 8  复制自己
 9
10  @return 返回一个拷贝的对象
11  */
12 - (id)clone;
13
14 @end

创建对象模型

Student.h

 1 #import <Foundation/Foundation.h>
 2 #import "PrototypeCopyProtocol.h"
 3
 4 @interface Student : NSObject <PrototypeCopyProtocol>
 5
 6 @property (nonatomic, strong) NSString *name;
 7 @property (nonatomic, strong) NSString *age;
 8 @property (nonatomic, strong) NSString *score;
 9 @property (nonatomic, strong) NSString *address;
10
11 #pragma mark - PrototypeCopyProtocol method
12 - (id)clone;
13
14 @end

Student.m

 1 #import "Student.h"
 2
 3 @implementation Student
 4
 5 - (id)clone {
 6
 7     Student *stu = [[[self class] alloc] init];
 8
 9     stu.name    = self.name;
10     stu.age     = self.age;
11     stu.score   = self.score;
12     stu.address = self.address;
13
14     return stu;
15 }
16
17 @end

下面是Controller中使用:

 1 - (void)viewDidLoad {
 2     [super viewDidLoad];
 3
 4     //创建第一个学生实例
 5     Student *stu1 = [[Student alloc] init];
 6
 7     stu1.name  = @"Jackey";
 8     stu1.age   = @"18";
 9     stu1.score = @"90";
10     stu1.score = @"重庆";
11
12     //创建第二个学生实例
13     Student *stu2 = [stu1 clone];
14
15     stu2.name = @"Franky";
16
17 }
时间: 2024-10-13 20:20:35

Objective-C 原型模式 -- 简单介绍和使用的相关文章

原型模式简单介绍【设计模式3】

前文回顾: 1 //上下文 2 public class Context { 3 public String getHandlerResult() { 4 return handlerResult; 5 } 6 7 public void setHandlerResult(String handlerResult) { 8 this.handlerResult = handlerResult; 9 } 10 11 private String handlerResult; 12 } 13 //H

设计模式之原型模式简单即复杂(二十四)

简单只是看不见的复杂, 这很原型, 传送 原型模式(proptotype pattern)定义 用原型模式指定创建对象, 并且通过拷贝这些原型对象创建新的对象 原型模式的使用 对象的创建非常复杂, 可以使用原型模式快捷的创建对象 在运行过程中不知道对象的具体类型, 可使用原型模式创建一个相同类型的对象, 或者在运行过程中动态的获取到一个对象的状态 对于clone方法, 它执行的是浅拷贝, 也就是说如果是引用类型的属性, 则它不会进行拷贝, 而是只拷贝引用, 也就是说拷贝的对象中还有个成员对象引用

MVC模式简单介绍

模型-视图-控件(model-View-Controller)MVC结构是一种开发模块的方法,它将数据存储和数据处理从数据的可视化表示中分离出来.存储和处理数据的组件称为模型,它包括模块的实际内容.表示数据的组件称为视图,它处理模块全部必要的行为,完毕模块的全部显示.控件一般是一种用来获取数据的组件. 把模块分解成模型与视图有两个明显长处: 1.能够使用多个视图共享同一个模型数据. 2.能够简化复杂应用程序的编写,使用模块具有可伸缩性,而且易于维护.能够改动视图但不会影响模型,反之亦然. 使用M

android MVP模式简单介绍

原文 http://zhengxiaopeng.com/2015/02/06/Android%E4%B8%AD%E7%9A%84MVP/ 前言 MVP作为一种MVC的演化版本在Android开发中受到了越来越多的关注,但在项目开发中选择一种这样的软件设计模式需保持慎重心态,一旦确定 使用MVP作为你App的开发模式那么你就最好坚持做下去,如果在使用MVP模式开发过程中发现问题而且坑越来越大,这时你想用MVC等来重新设计的话基 本上就等于推倒重来了.要知道在Android上MVP在现在为止并没有统

Objective-C 外观模式--简单介绍和使用

外观模式(Facade),为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用. 在以下情况下可以考虑使用外观模式: (1)设计初期阶段,应该有意识的将不同层分离,层与层之间建立外观模式. (2) 开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调用接口. (3) 维护一个大型遗留系统的时候,可能这个系统已经非常难以维护和扩展,但又包含非常重要的功能,为其开发一个外观类,以便新系统与其交互. 有点: (1)实现了子系统与客户端之间的松耦合关系. (2

Android MVP模式简单介绍:以一个登陆流程为例

老的项目用的MVC的模式,最近完成了全部重构成MVP模式的工作,虽然比较麻烦,好处是代码逻辑更加清楚.简洁,流程更加清晰,对于后续版本迭代维护都挺方便.对于一些想要学习MVP模式的同学来讲,百度搜出来的好多都没法直接转化为项目里可以直接用的东西,所以这里正好拿出自己项目里已经用了的,你们可以直接用到自己的项目里.当然,不可能把所有项目代码在这里放出来,所以就拿登陆的流程出来,这个比较合适也比较常用. 1.先看下包结构: model:放一些bean类,以及网络处理类RetrofitManager,

原型模式小试

同为创建型模式的原型模式与单例模式是密不可分的,这也是最常用的设计模式之一. 原型模式是一种非常简单的设计模式.这里除了基本介绍和演示,还详细介绍了Java中原型模式的本质. 一.介绍 同样,先来看一下<研磨设计模式>的定义--用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 原型模式的本质--克隆生成对象. 那么原型模式是什么意思呢?说白了就是克隆自身.我们知道Java中没有引用这个概念,Java用变量名代表引用.像 Apple a = new Apple(); 我们知道,想要

创建型设计模式 之 原型模式

同为创建型模式的原型模式与单例模式是密不可分的,这也是最常用的设计模式之一. 原型模式是一种非常简单的设计模式.这里除了基本介绍和演示,还详细介绍了Java中原型模式的本质. 一.介绍 同样,先来看一下<研磨设计模式>的定义——用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 原型模式的本质——克隆生成对象. 那么原型模式是什么意思呢?说白了就是克隆自身.我们知道Java中没有引用这个概念,Java用变量名代表引用.像 Apple a = new Apple();我们知道,想要操

图解Java设计模式之原型模式

图解Java设计模式之原型模式 克隆羊的问题 原型模式 - 基本介绍 原型模式在Spring框架中源码分析 浅拷贝的介绍 深拷贝基本介绍 克隆羊的问题 现在有一只羊tom,姓名为 : tom,年龄为 :1,颜色为 :白色,请编写程序创建和tom羊属性完全相同的10只羊. 传统方式解决克隆羊的问题 package com.example.demo.prototype; public class Sheep { private String name; private int age; privat