iOS中的设计模式(二)- 原型模式

ops/2025/1/12 8:29:08/

引言

在软件开发中,创建对象的过程往往涉及许多复杂的初始化步骤,尤其是在对象之间具有相似属性或状态时。传统的做法是每次都从头开始创建新的实例,然而,这种方法可能导致性能问题和代码冗余。为了解决这一问题,原型模式应运而生,它通过复制现有对象来创建新实例,从而避免了冗长的初始化过程,并提高了程序的执行效率。

在iOS开发中,原型模式仍然是一个有效的设计模式,尤其是在需要生成大量相似对象时。通过使用Swift中的NSCopying协议,我们能够轻松实现对象的复制,从而避免不必要的初始化操作,节省资源并提高性能。

在这篇博客中,我们将深入探讨原型模式的概念、在Swift中的实现方式,以及它在iOS开发中的实际应用场景,帮助你在合适的情况下更高效地管理对象创建过程。

原型模式简介

原型模式是一种非常简单的设计模式。客户端知道抽象原型类。在运行时,抽象原型子类的任何对象都可以按照客户端的意愿被复制。因此,无需手动创建就可以制造同一类型的多个实例。

原型声明了复制自身的接口,而具体的原型子类需要实现复制自身的操作,荣光请求原型复制其自身来创建一个新的对象。

浅复制与深复制

如果对象有个指针型成员变量指向内存中的某个资源,那么如何复制这个对象呢?指针只是存储内存中资源地址的占位符。在复制操作中,如果只是将指针赋值给新对象,那么底层的资源实际上仍然由两个实例在共享,所有引用类型都是这样。

尽管指针1生成了一个相同的实例作为它的副本,但实际上两个实例的指针仍然指向内存中的同一个资源。因此只复制了指针的值而不是实际资源的值,这称为浅复制。

而深复制,不仅要复制指针值,同时还要生成内存中实际资源的真实副本。因此副本对象的指针指向内存中不同位置的一个资源的副本。

原型模式在Swift中的实现

Cocoa Touch框架为NSObject的派生类提供了实现深复制的协议。NSObject的子类需要遵循NSCopying协议及其方法copy(with zone: NSZone? = nil)。NSObject有一个实例方法叫做copy。默认copy方法调用copy(with zone: NSZone? = nil)。对于遵循了NSCopying协议的子类,需要实现这个方法。iOS中,这个方法方法会创建一个新的副本对象,然后将其返回。此方法的调用者要负责释放返回的对象。

具体示例如下:

import Foundation// 定义一个遵循NSCopying协议的类
class Person: NSObject, NSCopying {var name: Stringvar age: Intinit(name: String, age: Int) {self.name = nameself.age = age}// 实现copy方法func copy(with zone: NSZone? = nil) -> Any {// 创建并返回该对象的副本let copy = Person(name: self.name, age: self.age)return copy}
}// 使用原型模式创建副本
let person1 = Person(name: "John", age: 30)
let person2 = person1.copy() as! Personprint(person1.name)  // John
print(person2.name)  // John
print(person1 === person2)  // false (不同的实例)

其中的关键点在于:

  • 遵循NSCopying协议:我们的类需要遵循NSCopying协议,并实现copy(with:)方法。
  • 创建副本:在copy(with:)方法方法中,我们可以使用现有对象的属性来创建一个新的对象,并返回副本。
  • 浅拷贝与深拷贝:我们可以根据需要来选择浅拷贝或者深拷贝,如果对象包含引用类型的属性并且需要完全复制这些引用类型的对象,那我们就需要手动来实现深拷贝。

原型模式适用于引用类型的对象,而不是值类型的对象。在Swift中,由于struct是值类型,其复制行为是内建的,原型模式的意义就显得不那么必要了。

结语

原型模式作为一种创建型设计模式,通过复制现有对象来生成新实例,能够显著优化对象创建过程,特别是在对象之间具有相似性或初始化成本较高时。通过Swift中的NSCopying协议,我们可以轻松实现对象的复制,提升应用的性能与可维护性。

在iOS开发中,原型模式不仅能够帮助我们减少重复的初始化逻辑,还能在资源有限的环境中为复杂对象的管理提供一种高效的解决方案。无论是在处理大量数据、图形界面元素,还是其他需要大量相似对象的场景中,原型模式都能发挥重要作用。

虽然原型模式并不是所有场景下都适用,但当面对需要频繁创建相似对象的情况时,它无疑是一个值得考虑的优秀设计模式。希望通过本文,你能够更加清楚地理解原型模式的应用场景,并能够在合适的地方合理地使用它,从而提高开发效率并优化应用性能。


http://www.ppmy.cn/ops/149392.html

相关文章

QT + opencv 实现形状(轮廓)模板匹配

QT opencv 实现形状(轮廓)模板匹配 实现思路 1.创建模板数据:主要是提取模板的轮廓信息,这一步通常通过边缘检测实现。将模板的轮廓信息存储起来。 代码: //创建形状模板 bool cvLearnShapeMatchPattern_(Mat matDst, MyShapeUiParam pa…

字节小米等后端岗位C++面试题

C 基础 引用和指针之间的区别?堆栈和堆中的内存分配有何区别?存在哪些类型的智能指针?unique_ptr 是如何实现的?我们如何强制在 unique_ptr 中仅存在一个对象所有者?shared_ptr 如何工作?对象之间如何同步…

RK3568-ubuntu旋转显示和触摸

旋转屏幕显示 临时生效&#xff1a;xrandr -o <normal,inverted,left,right,0,1,2,3> 永久生效&#xff1a;/etc/X11/Xsession.d/55gnome-session_gnomerc最后一行添加临时生效命令旋转屏幕触摸 方法1&#xff1a;cp /usr/share/X11/xorg.conf.d/40-libinput.conf /etc…

机器学习顶会NeurIPS: AGILE: A Novel Reinforcement Learning Framework of LLM Agents

&#x1f31f; 研究背景 &#x1f31f; 随着大型语言模型&#xff08;LLMs&#xff09;在指令遵循、推理和零样本学习等方面展现出卓越的能力&#xff0c;基于LLMs的自主代理&#xff08;LLM Agents&#xff09;的研究逐渐兴起。然而&#xff0c;如何将规划、反思、工具使用等…

模型 九屏幕分析法

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。九屏幕法&#xff1a;全方位分析问题的系统工具。 1 九屏幕分析法的应用 1.1 新产品研发的市场分析 一家科技公司计划开发一款新型智能手机&#xff0c;为了全面评估市场潜力和风险&#xff0c;他们…

C#数据库操作系列---SqlSugar完结篇

1. 不同寻常的查询 之前介绍了针对单个表的查询&#xff0c;同样也是相对简单的查询模式。虽然开发完全够用&#xff0c;但是难免会遇到一些特殊的情况。而下面这些方法就是为了解决这些意料之外。 1.1 多表查询 SqlSugar提供了一种特殊的多表查询方案&#xff0c;使用IQuer…

Redis常见知识点

1、什么是缓存穿透&#xff1f; 缓存穿透是指查询一定某个key是否存在&#xff0c;每次不存在都查询DB会把DB压垮。 解决方案的话&#xff0c;我们通常都会用布隆过滤器来解决。 布隆过滤器&#xff1a;在查找一个数是否在一个集合中使用的&#xff0c;通过对数组长度取模&a…

在php中,Fiber、Swoole、Swow这3个协程都是如何并行运行的?

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram&#xff0c;自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 &#xff1f; 5 IDEA必装的插件&…