iOS 开发中常见的设计模式
最近有小伙伴问到在iOS开发中的几种设计模式,这里摘录一下别人的总结(因为已经感觉总结得差不多了,适用的可以阅读一下)
首先是开发中的23中设计模式分为三大类:1.创建型 2.结构型 3.行为型 (iOS常用大概6种)
创建型
1. Factory Method(工厂方法)
2. Abstract Factory(抽象工厂)
3. Builder(建造者)
4. Prototype(原型)
5. Singleton(单例)
结构型
6. Adapter Class/Object(适配器)
7. Bridge(桥接)
8. Composite(组合)
9. Decorator(装饰)
10. Facade(外观)
11. Flyweight(享元)
12. Proxy(代理)
行为型
13. Interpreter(解释器)
14. Template Method(模板方法)
15. Chain of Responsibility(责任链)
16. Command(命令)
17. Iterator(迭代器)
18. Mediator(中介者)
19. Memento(备忘录)
20. Observer(观察者)
21. State(状态)
22. Strategy(策略)
23. Visitor(访问者)
一、代理模式
应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现。
优势:解耦合
敏捷原则:开放-封闭原则
实例:tableview的 数据源delegate,通过和protocol的配合,完成委托诉求。
列表row个数delegate
自定义的delegate
二、观察者模式
应用场景:一般为model层对,controller和view进行的通知方式,不关心谁去接收,只负责发布信息。
优势:解耦合
敏捷原则:接口隔离原则,开放-封闭原则
实例:Notification通知中心,注册通知中心,任何位置可以发送消息,注册观察者的对象可以接收。
kvo,键值对改变通知的观察者。
三、MVC模式(我感觉MVC应该不是归类到设计模式)
应用场景:非常古老的设计模式,通过数据模型,控制器逻辑,视图展示将应用程序进行逻辑划分。
优势:使系统,层次清晰,职责分明,易于维护
敏捷原则:对扩展开放-对修改封闭
实例:model-即数据模型,view-视图展示,controller进行UI展现和数据交互的逻辑控制。
四、单例模式
应用场景:确保程序运行期某个类,只有一份实例,用于进行资源共享控制。
优势:使用简单,延时求值,易于跨模块
敏捷原则:单一职责原则
实例:[UIApplication sharedApplication]。
注意事项:确保使用者只能通过 getInstance方法才能获得,单例类的唯一实例。
java,C++中使其没有公有构造函数,私有化并覆盖其构造函数。
object c中,重写allocWithZone方法,保证即使用户用 alloc方法直接创建单例类的实例,
返回的也只是此单例类的唯一静态变量。
五、策略模式(使用较少)
应用场景:定义算法族,封装起来,使他们之间可以相互替换。
优势:使算法的变化独立于使用算法的用户
敏捷原则:接口隔离原则;多用组合,少用继承;针对接口编程,而非实现。
实例:排序算法,NSArray的sortedArrayUsingSelector;经典的鸭子会叫,会飞案例。
注意事项: 1,剥离类中易于变化的行为,通过组合的方式嵌入抽象基类
2,变化的行为抽象基类为,所有可变变化的父类
3,用户类的最终实例,通过注入行为实例的方式,设定易变行为
防止了继承行为方式,导致无关行为污染子类。完成了策略封装和可替换性。
六、工厂模式
应用场景:工厂方式创建类的实例,多与代理模式配合,创建可替换代理类。
优势:易于替换,面向抽象编程,application只与抽象工厂和易变类的共性抽象类发生调用关系。
敏捷原则:DIP依赖倒置原则
实例:项目部署环境中依赖多个不同类型的数据库时,需要使用工厂配合proxy完成易用性替换
注意事项:项目初期,软件结构和需求都没有稳定下来时,不建议使用此模式,因为其劣势也很明显,
增 加了代码的复杂度,增加了调用层次,增加了内存负担。所以要注意防止模式的滥用。
转载于:https://www.cnblogs.com/somethingWithiOS/p/5689024.html
iOS 开发中常见的设计模式相关推荐
- iOS开发中常见的一些异常
iOS开发中常见的一些异常 参考文章: (1)iOS开发中常见的一些异常 (2)https://www.cnblogs.com/feng9exe/p/7244936.html 备忘一下.
- Android开发中常见的设计模式
对于开发人员来说,设计模式有时候就是一道坎,但是设计模式又非常有用,过了这道坎,它可以让你水平提高一个档次.而在android开发中,必要的了解一些设计模式又是非常有必要的.对于想系统的学习设计模式的 ...
- php mysql设计中常问_PHP开发中常见的设计模式
一.工厂模式 工厂模式是我们最常用的实例化对象模式,是用工厂方法代替new操作的一种模式. 使用工厂模式的好处是,如果你想要更改所实例化的类名等,则只需更改该工厂方法内容即可,不需逐一寻找代码中具体实 ...
- iOS开发中常见的性能优化技巧
性能问题的主要原因是什么,原因有相同的,也有不同的,但归根到底,不外乎内存使用.代码效率.合适的策略逻辑.代码质量.安装包体积这一类问题. 但从用户体验的角度去思考,当我们置身处地得把自己当做用户去玩 ...
- iOS开发中常见的英文
mac,Macintosh:由苹果公司设计生产并且运行MacOS操作系统的个人电脑产品. Mac OS:是一套运行于苹果Macintosh系列电脑上的操作系统. iOS:iPhone OS,是由苹果公 ...
- 转载iOS开发中常见的警告及错误
iOS警告收录及科学快速的消除方法 前言:现在你维护的项目有多少警告?看着几百条警告觉得心里烦么?你真的觉得警告又不是错误可以完全不管么? 如果你也被这些问题困惑,可以和我一起进行下面的操作.其实 ...
- Android开发中常见的设计模式深入浅出——观察者模式Observer
##最近老大写的Android项目里用到了RxBus然后我就去百度了 让我先了解RxJava 然后RxJava又是由观察者模式的变种写的 所以打算从头学一遍!!! 观察者模式 Observer 顾名思 ...
- 如何深入理解 iOS 开发中的锁?
摘要 本文的目的不是介绍 iOS 中各种锁如何使用,一方面笔者没有大量的实战经验,另一方面这样的文章相当多,比如 iOS中保证线程安全的几种方式与性能对比.iOS 常见知识点(三):Lock.本文也不 ...
- 理解:iOS开发中锁的实现原理
摘要 本文的目的不是介绍 iOS 中各种锁如何使用,一方面笔者没有大量的实战经验,另一方面这样的文章相当多,比如 iOS中保证线程安全的几种方式与性能对比.iOS 常见知识点(三):Lock.本文也不 ...
- 深入理解 iOS 开发中的锁
深入理解 iOS 开发中的锁 摘要 本文的目的不是介绍 iOS 中各种锁如何使用,一方面笔者没有大量的实战经验,另一方面这样的文章相当多,比如 iOS中保证线程安全的几种方式与性能对比.iOS 常见知 ...
最新文章
- 【c语言】蓝桥杯算法提高 企业奖金发放
- 虚拟主机创建虚拟lan_创建虚拟背景应用
- Convert、Parse、TryParse、(int)等区别(细节小记)
- 2021总结-》2022年
- 淘宝特价版招聘:年薪50万,35岁以上优先;1900万:一线城市财富自由的入门级门槛;鸿蒙OS成武汉大学专业选修课 | 极客头条...
- 环绕声混响效果器-Acon Digital Verberate Immersive 2.2.1 WiN-MAC
- 内外网共存环境迁移Exchange 2010至Exchange 2016
- Python项目:爬取IT互联网高薪热门职位数据并进行可视化分析
- 计算机搜不到连接打印机主机,计算机找不到打印机设备?如果我无法连接怎么办?让我们看一下处理方法...
- java实现高清图片剪切
- php怎么实现拼图功能,照片拼图效果怎么做 将一张照片制作成拼图的效果
- AndroidStudio之Git提交代码出现author ‘xxx‘ is not ‘Name ‘ and matches no existing author 的解决方法
- 小米传送门导致OnTouch事件中MotionEvent.ACTION_UP不执行
- 卡拉OK歌词原理和实现高仿Android网易云音乐
- 21天学会Linux----Day1:Linux环境搭建
- 与迭代次数有关的一种差值结构
- 数据结构-特殊矩阵【对称矩阵、上三角下三角矩阵、三对角矩阵】的压缩存储代码实现
- fatal: unable to access ‘https://github.com/PX4/PX4-Autopilot.git/‘: Failed to connect to github.com
- html实现文本的查找与替换,在 InDesign 中查找并替换文本
- 关于windows10家庭中文版最近更新后无法使用共享打印机
热门文章
- Google C++ unit test 在ARM Android 2.3 上的编译与使用
- PHP文件上传后缀名与文件类型对照表
- 至 上海神力科技有限公司 的留言 http://www.sl-power.com/
- 今天辞去了联盟的版主职务
- 【Java入门提高篇】Day26 Java容器类详解(八)HashSet源码分析
- 读取页面上所有的checkbox
- 字符,字符集,字符编码
- 【诗和远方】一个蒟蒻的年初展望
- sublime text3的一些小技巧记录(配gif图)
- Docker系列(一)安装