您的位置:首页 > 移动开发 > IOS开发

iOS 设计模式小结

2016-08-06 16:36 253 查看
工厂模式

工厂方法模式:定义创建对象的接口,让子类决定实例化哪一个类。工厂方法使得一个

类的实例化延迟到其子类。

在iOS开发中基本上每个类的initWithXXX方法都会这样用。

//通过工厂方法创建类的实现举例
- (id)initWithName:(NSString*)name{
if(self = [super init]){
self.name = name;
//添加初始化相关细节
...
}
return self;
}


很多大牛总结的很好:

编译时无法准确预期要创建的对象的类;

类想让子类决定在运行时创建什么;

类有若干辅助类为其子类,而你想将返回哪个子类这一信息局部话;

工厂方法在CocoaTouch中经常用到。

代理模式

做iOS开发的对代理模式一定再熟悉不过了,UItableView,XMLparse,URLConnection等等,而且我们在开发过程中也经常写自己的代理模式,再iOS代理跟协议基本是分不开的。代理也经常会跟block进行对比。代理的思想是,我写一个接口,但是不实现,声明这个接口的人会在他的方法中实现,也就是他就是我的代理。

如果我们要实现系统的代理,只需要在

@interface FirstViewController : UIViewController <UIActionSheetDelegate>


而且我们还要看UIActionSheetDelegate的接口,如果前面有@required是必须要实现的,如果是@option则是不必须要实现的。当然我们也可以写自己的代理

@protocol ChangedestinationViewDelegate <NSObject>

- (void) changeText:(NSString*) text;

@end


注意协议的语法规则,然后在其他需要实现这个协议的类里面实现这个方法即可,相当于我的委托。

扩展:代理模式跟block模式相比,block是包含已小段代码块的,也是实现回调的方式,在网络请求还有多线程的开发我们经常用到block,block跟delegate相比较而言,它可读性更强,因为delegate是把事件委托给其他类实现,在阅读代码经常要跳转。但是delegate适合多次回调使用,而block适合一次回调,适合逻辑比较简单的情况就像AFnetworking,处理要么请求成功,要么请求失败。这种经常用block实现,对于block的具体应用,会在后面详解。

观察者模式

delegate应该也算是观察者模式的一种,不过iOS开发delegate是个比较重要的所以就单独进行了分析。除了代理,还有KVO,NSNotificationCenter.我们经常会对比这三种模式。

KVO的实现是基于KVC的,很多大牛的博客讲解的非常详细:

http://www.cnblogs.com/kenshincui/p/3871178.html

大家可以参考这个,KVO是键——值的来触发事件发生的。所以每次值发生变化,只有观察这个值对应的健的观察者才响应。

而NSNotificationCenter是一个消息控制中心,只要在这个消息中心进行了注册,每次post相应的消息,这些注册的都会接受通知并且做出响应,所以这种方式适合多个的情况。具体的实现,大家可以参考:http://www.jianshu.com/p/a4d519e4e0d5

动作-目标模式

上面的观察者模式也属于这种模式,最明显的是跟用户交互使用的UIKit里面的控件。

点击button,点击textfield,点击label等这些触发的事件,原理很简单,我就不再详细再把东西说一遍了,很多博客讲的都非常详细:http://blog.csdn.net/apple_darling/article/details/50344579

单例模式

单例模式是一种常用的软件设计模式

通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源

如果希望系统中某个类的对象只能存在一个,单例模式是最好的解决方案

iOS中最常见的单例就是UIApplication

应用场景:

音频播放,背景音乐!

硬件资源:加速器、[UIScreen mainScreen]

sharedXX, mainXXX

单例的实现步骤

重写allocWithZone方法

allocWithZone方法是对象分配内存空间时,最终会调用的方法,重写该方法,保证只会分配一个内存空间

建立sharedXXX类方法,便于其他类访问

(id)allocWithZone:(struct _NSZone *)zone

{

static Ticket *instance;

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

instance = [super allocWithZone:zone];

});

return instance;

单例小结

优点

可以阻止其他对象实例化单例对象的副本,从而确保所有对象都访问唯一实例

提供了对唯一实例的受控访问。

由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。

允许可变数目的实例。

缺点

单例对象一旦建立,对象指针是保存在静态区的,单例对象在堆中分配的内存空间,会在应用程序终止后才会被释放,所以被单例模式拥有的资源要谨慎使用,避免造成内存泄露。

由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。

单例类的职责过重,在一定程度上违背了“单一职责原则”。

滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。

提示

只有确实需要唯一使用的对象才需要考虑单例模式,不要滥用单例

其实不仅仅是iOS开发用到单例模式,我做的再C++开发,java开发单例模式也是经常用到的,在C++里面,单例模式是定义一个私有成员变量,通过公有的方式对它进行实例化当且仅当仅能被实例化一次。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios 设计模式