在软件开发中,不管是什么开发语言总会伴随着一下常见的设计模式,如MVC模式、代理模式、单例模式等等。下面就对开发中经常使用的一下模式进行概括整理。算法
首先先说一下什么是设计模式?数据库
设计模式是一种编程经验,就是用比较成熟的逻辑来处理某一类型的事情。有了它咱们就能够比较清晰明了的来处理开发中遇到的问题。编程
在iOS中经常使用的设计模式有哪些?设计模式
在开发中经常使用的设计模式包含单例模式、观察者模式、代理模式、工厂模式、策略模式、MVC模式以及MVC的变种MVVM模式。app
以上就是经常使用的设计模式,固然还有一些不经常使用的模式,如中介者模式、组合模式等测试
下面我就一一解释经常使用的设计模式spa
1、单例模式设计
单例模式能够保证APP在程序运行中,一个类有且只有惟一一个实例(即不管请求建立多少次,始终返回同一个实例),而且在整个APP程序中,这一份资源是共享的。它一般采用懒加载的方式在第一次用到实例的时候再去建立。代理
优势:使用简单,延时求值,易于跨模块server
敏捷原则:单一职责原则
示例:苹果大量使用了此模式。例如:[NSUserDefaults standardUserDefaults], [UIApplication sharedApplication], [UIScreen mainScreen], [NSFileManager defaultManager],全部的这些方法都返回一个单例对象。
我的理解:
不少状况下咱们并不会关心一个类是否有多个实例,占多少内存的问题。但是在一些状况下,只有一个实例显得很是合理。举例来讲,咱们有一个配置文件,可是有好多歌类同时修改这个文件,咱们建立一个单例就显得很合理了。
2、观察者模式
观察者模式本质上是一种发布-订阅模型,泳衣消除具备不一样行为的对象之间的耦合。经过这一模式,不一样对象之间能够协同工做,同时他们也能够被复用于其余地方Observer从Subject订阅通知,ConncrecteObserver实现重现Observer并将其重载其update方法。
一旦Subject的实例须要通知Observer任何新的变动,Subject就会发送update消息来通知存储在其内部类中所注册的Observer,在ConcreteObserver的update方法中,Subject的内部状态可被获取并进行后续处理。
优势:解耦合
敏捷原则:接口隔离原则,开放-封闭原则
示例:Notification通知中心,注册通知中心,任何位置均可以发送消息,注册观察者的对象均可以接收消息;KVO键值对改变通知的观察者等
我的理解:
通常为model层,对从controller和view进行的通知方式,不关心谁去接受,只负责发布消息。
3、代理模式
代理模式是一种消息传递方式,一个完整的代理模式包括:委托对象,代理对象和协议。
协议“用来指定代理双方能够作什么,必须作什么。
委托对象:根据协议指定代理对象须要完成的事,即调用协议中的方法。
代理对象:根据协议实现委托方须要完成的事,即实现协议中的方法。
代理模式完成委托方交给的任务,委托方有一些任务本身不想完成,可是还须要实现,择将该任务存放在协议中,由代理完成。可是代理并不会主动的执行任务,须要委托方通知代理。
优势:解耦合
敏捷原则:开放-封闭原则
示例:tableview的 数据源delegate;列表row个数delegate;自定义的delegate等
我的理解:
当一个类的某些功能须要由别的类来实现,可是又不肯定具体会是哪一个类实现。可使用代理。举个例子,我在公司敲代码,忽然想吃水果,这是我就拿起手机去每日生鲜订一份水果,而后每日生鲜会下单给店铺并让店铺给我送过来。这个过程当中,我是委托方,APP是个人代理,我买了一份水果并付给APP钱,这就是购买协议。我只须要从APP上都卖,其他操做都是APP去处理。我付的钱就是参数,送过来的水果就是处理结果。再买水果的同事我还能够定外卖,这时须要用到饿了么APP。饿了么当个人代理。这就是多个代理对象。实现一对多。
4、工厂模式
专门定义一个类来负责建立其余类的实例,被建立的实例痛楚具备共同的父类。简单来讲就是定义一个抽象类,抽象类中生命公共的特征及属性,抽象子类继承抽象类,趋势线具体的操做。工厂类根据外界需求,在工厂类中建立对应的抽象子类实例并传给外界,而对象的建立室友外界决定的,外界只须要知道抽象子类对应参数便可,并不须要抽象子类的建立过程,在外界使用甚至不用引入抽象子类。
优势:易于替换,面向对象编程,application只与抽象工厂和易变类的共性抽象类发生调用关系。
经过简单工厂模式的重构,咱们就实现了低耦合度的代码结构,作到了对外扩展开放,对修改关闭。若是再增长任何的操做方法,只须要继承操做方法父类,新建一个操做子类,而且在简单工厂类里面多添加一个else if的判断便可。
缺点:工厂类集中了全部产品的建立逻辑,一旦不能正常工做,整个系统都会受到影响,并且当产品类多、结构复杂时,把全部的建立工做放在一个工厂中,后期扩展维护比较困难。
敏捷原则:DIP一来倒置原则
示例:工厂方式建立类的实例,多与proxy模式配合,建立可替换代理类。如项目部署环境中依赖多个不一样类型的数据库时,须要使用工厂配合proxy完成易用性替换
我的理解:
我认为工厂模式就是为了建立对象的。通常来讲咱们建立对象都是alloc一个,若是须要建立100个,在for循环中还好。但是实际中每每不是如此。咱们可能会在不一样的地方去建立,难道咱们要写100次?而且若是咱们在建立时给属性添加值,那就更复杂了。那么咱们若是写一个父类并在里面写一个createObj的方法,把建立和赋值写在方法里,而后都继承这个父类这不就简单不少了。这就是简单工程方法。这也说明了工厂类的限制,就是建立的类必须有同一个父类,并且建立的类在不一样地方调用的方法一致。
在项目初期,软件结构和需求都没有稳定下来时,不建议使用此模式。
5、策略模式
策略模式定义了一系列的算法,并将每个算法封装起来,并且使他们还能够互相替换。使算法自己和使用算法的用户分割开来,互相独立
优势:使算法的变化独立于使用算法的用户
敏捷原则:接口隔离原则,多用组合,少用继承,针对接口编程而非实现。
我的理解:
举一个简单的例子,就像地图APP中,肯定起始点和目的地后咱们能够选择不一样的出行方式(步行、公交、私家车等)。
6、MVC模式
MVC模式是一种古老的软件设计典范。经过数据模型,控制器逻辑,视图展现将应用程序进行逻辑划分。将控制器逻辑汇集在一个部件中,在改进页面和交互是不须要从新编写业务逻辑。
MVC涉及的三个角色:
Model:模型对象用来封装应用程序的数据,并定义操做和处理该数据的逻辑和运算。
View:试图对象是用户在应用程序中能够看到的对象。它知道如何将本身展现绘制出来,并对用户的操做作出反应。
Controller:控制器是一个协调全部工做的中介者。它访问模型中的数据并在视图中展现它们,同时它们还监听事件和操做数据。经过它,视图能够了解模型的更改,反之亦然。控制器对象还能够为应用程序执行设置和协调人物,并管理其余对象的生命周期。
优势:是系统层次清晰,职责分明,易于维护。
敏捷原则:对扩展开发-对修改封闭
我的理解:
一个MVC模式的好的实现也就意味着每个对象都会被划分到上面的三种角色中。能够用下图来协助理解。
模型会把数据的变动通知控制器,而后控制器更新视图数据。
试图对象通知控制器用户的操做,控制器要么根据需求来更新模型,要么检索任何被请求的数据。
7、MVVM模式
在iOS应用日益增加的重量级控制器的情形下,典型的MVC模式中,许多逻辑被安放在ViewController中。他们中的一些确实属于viewController,但更多的是所谓的表示逻辑。为了避免让控制器日益增大,便于管理便出现了MVVM。
MVVM是MVC的加强版,并将表示逻辑从Controller中移出放在一个新的对象里面,即ViewModel。在iOS中使用MVVM的动机就是为了减小ViewController的复杂性并使得表示逻辑更易于测试。
ViewModel:位于ViewController和Model之间,是二者的沟通桥梁,是一些逻辑的处理。
这就是我对于常见设计模式的一些整理概括,才疏学浅,若有问题,敬请指教。