关于 面向对象的设计模式

对于面向对象的设计模式,想必大家并不陌生吧。

纵观23种设计模式中,数单例模式(Singleton)和工厂模式(Factory Method)最为熟悉和基础吧。当然,本文总结Singleton模式,对于其他设计模式不做叙说。

Singleton模式,即单例模式。顾名思义,主要用于做应用程序的资源共享控制。用途很多⋯⋯

实质为,单例是在程序声明周期里 有且仅有 被实例化过一次的类。为确保实例化的唯一,利用类的 类(static)方法来生成和访问对象。

至此,你便可以在程序中任何地方访问类的单例对象,因为只实例化唯一的一次,所以,并不用 alloc、init、autorelease初始化方法。

Singleton 模式的实现

在objective-C中,实现Singleton模式,只需实现以下四个步骤:

 

1.  为 Singleton Object 实现一个静态实例,并初始化,然后设置成nil;

2. 实现一个实例构造方法 (通常命名为 sharedInstance 或者 sharedManager) 检查上面声明的静态实例是否为nil,如果是,则新建并返回一个本类实例;

3. 重写allocWithZone: 方法,用来保证当其他人直接使用 alloc 和init 试图获得一个新实例的时候,不会产生一个新的实例。

4. 适当地实现  allocWithZone,  copyWithZone,  release 和 autorelease。

Sinleton.h 头文件

  1. //
  2. //  Singleton.h
  3. //  singleton
  4. //
  5. //  Created by leondun on 11-4-20.
  6. //  Copyright 2011 leondun. All rights reserved.
  7. //
  8. #import <Foundation/Foundation.h>
  9. @interface Singleton : NSObject {
  10. }
  11. +(Singleton *)sharedInstanceMethod;
  12. @end

Singleton.m 实现文件

  1. #import "Singleton.h"
  2. static Singleton * sharedInstance = nil;
  3. @implementation Singleton
  4. //获取单例
  5. +(Singleton *)sharedInstanceMethod
  6. {
  7. @synchronized(self) {
  8. if (sharedInstance == nil)
  9. sharedInstance = [[self alloc] init];
  10. }
  11. }
  12. return sharedInstance;
  13. }
  14. //唯一一次alloc单例,之后均返回nil
  15. + (id)allocWithZone:(NSZone *)zone
  16. {
  17. @synchronized(self) {
  18. if (sharedInstance == nil) {
  19. instance = [super allocWithZone:zone];
  20. return instance;
  21. }
  22. }
  23. return nil;
  24. }
  25. //copy返回单例本身
  26. - (id)copyWithZone:(NSZone *)zone
  27. {
  28. return self;
  29. }
  30. //retain返回单例本身
  31. - (id)retain
  32. {
  33. return self;
  34. }
  35. //引用计数总是为1
  36. - (unsigned)retainCount
  37. {
  38. return 1;
  39. }
  40. //release不做任何处理
  41. - (void)release
  42. {
  43. }
  44. //autorelease返回单例本身
  45. - (id)autorelease
  46. {
  47. return self;
  48. }
  49. //
  50. -(void)dealloc
  51. {
  52. [super dealloc];
  53. }
  54. @end

部分代码说明:

1. synchronized  
这个主要是考虑多线程的程序,这个指令可以将{ } 内的代码限制在一个线程执行,如果某个线程没有执行完,

其他的线程如果需要执行就得等着。

2. allocWithZone 这个是重载的,因为这个是从制定的内存区域读取信息创建实例,所以如果需要的单例已经有了,

就需要禁止修改当前单例,所以返回 nil。

3.allocWithZone、copyWithZone 与 NSZone为何物?

简单来说,可以想象成一个内存池,alloc或者dealloc这些操作,等是在这个内存池中操作的。Cocoa 总是会分配 一个默认的NSZone,

任何默认的内存操作都是在这个“Zone”上进行的。

使用默认的NSZone存在缺陷,因为它是全局范围的,频繁使用过多,必然会导致内存的碎片化。尤其是用到大量的alloc 和dealloc时,

性能上就会收到一定的影响。为此,你完全可以自己生成一个NSZone,并将alloc,copy等全部限制在一个“Zone”中。

注意:在此并未考虑到 线程安全问题,

1.Singleton本身是否线程安全。

2.Singleton的实例是否线程安全。

在此并不讨论线程安全问题,点到为止。

其实如果你确定不会过早释放单例可以尝试用下面的写法

static MyClass *instance = nil ;

+(id)sharedInstance{

if(!instance ){

instance = [MyClass new];

}

return instance;

}

从别人写的 Object-C 中 Singleton (单例) 模式 中的一些理解--备的更多相关文章

  1. Java设计模式:Singleton(单例)模式

    概念定义 Singleton(单例)模式是指在程序运行期间, 某些类只实例化一次,创建一个全局唯一对象.因此,单例类只能有一个实例,且必须自己创建自己的这个唯一实例,并对外提供访问该实例的方式. 单例 ...

  2. Singleton(单例)模式

    Singleton(单例)模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点. public class Singleton { private static Singleton ourIns ...

  3. C++ Singleton (单例) 模式最优实现

    参考:http://blog.yangyubo.com/2009/06/04/best-cpp-singleton-pattern/ 索引 静态化并不是单例 (Singleton) 模式 饿汉模式 懒 ...

  4. 再看 Java 中的单例

    此前面试遇到了单例问题,本以为已经背的滚瓜烂熟,没想到被问单例如何避免被反射和序列化破坏,虽然后来还是等到了通知,但还是复习一下单例的实现方式,并学习防止反射和序列化破坏的手段. 基本实现方式 其他相 ...

  5. 在Swift中实现单例方法

    在写Swift的单例方法之前可以温习一下Objective-C中单例的写法: + (instancetype)sharedSingleton{ static id instance; static d ...

  6. Spring5源码解析-Spring框架中的单例和原型bean

    Spring5源码解析-Spring框架中的单例和原型bean 最近一直有问我单例和原型bean的一些原理性问题,这里就开一篇来说说的 通过Spring中的依赖注入极大方便了我们的开发.在xml通过& ...

  7. Spring源码分析(十三)缓存中获取单例bean

    摘要:本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 介绍过FactoryBean的用法后,我们就可以了解bean加载的过程了 ...

  8. 5.2:缓存中获取单例bean

    5.2  缓存中获取单例bean 介绍过FactoryBean的用法后,我们就可以了解bean加载的过程了.前面已经提到过,单例在Spring的同一个容器内只会被创建一次,后续再获取bean直接从单例 ...

  9. Swift中编写单例的正确方式

    在之前的帖子里聊过状态管理有多痛苦,有时这是不可避免的.一个状态管理的例子大家都很熟悉,那就是单例.使用Swift时,有许多方法实现单例,这是个麻烦事,因为我们不知道哪个最合适.这里我们来回顾一下单例 ...

随机推荐

  1. Delphi TdxBarManager通过代码生成菜单

    procedure TForm6.btn1Click(Sender: TObject);var  ABar:TdxBar;  ABarItem:TdxBarItem;  ABarSubItem:Tdx ...

  2. 2. Singleton模式

    这两种方法都提到了使用模版: (1) 参考文章:http://www.cnblogs.com/08shiyan/archive/2012/03/16/2399617.html 不同: a. 该方法直接 ...

  3. 首届京东自有品牌科技周“京东点亮生活”圆满成功 - 课程公告板 - 京东内部论坛 - Powered by Discuz!

    首届京东自有品牌科技周"京东点亮生活"圆满成功 - 课程公告板 - 京东内部论坛 - Powered by Discuz! 首届京东自有品牌科技周"京东点亮生活" ...

  4. 使用 FreeMarker 替换 JSP 的 10 个理由

    你还在使用 Java 服务器页面(俗称JSP)吗?我曾经也是,但是几年前我抛弃了它们,并且再也没有用过JSP了.JSP 是个很好的概念,但是它却剥夺了 web 开发的乐趣. 对我而言,这些都是小事,比 ...

  5. XML (DOM解析) 看看就行

    000000000000000000000000000000000000000 ------------------------------------------------------------ ...

  6. Jquery 的bind(), live(), delegate(), on()绑定事件方式

    1. 因为项目中经常会有利用jquery操作dom元素的增删操作,所以会涉及到dom元素的绑定事件方式,简单的归纳一下bind,live,delegate,on的区别,以便以后查阅. bind() 适 ...

  7. svn解决冲突 Aborting commit: 'XXXXXXXX'remains in conflict错误

    如果你遇到冲突,三件事你可以选择: “手动”合并冲突文本(检查和修改文件中的冲突标志). 用某一个临时文件覆盖你的工作文件. 运行svn revert <filename>来放弃所有的修改 ...

  8. SAX PULL解析实例

    XML三种解析方式: SAX解析:基于事件驱动,事件机制基于回调函数的,得到节点和节点之间内容时也会回调事件 PULL解析:相同基于事件驱动,仅仅只是回调时是常量 DOM解析:是先把XML文件装入内存 ...

  9. 国内三大PT(Private Tracker)站分析

    除这一行外,下面全部内容都是转载.出处不明. 国内三大PT(Private Tracker)站分析 先郑重的声明一下:本文以下的内容所有是复制粘贴的,不代表老夫的观点. 事实上内容我也没细致看. 贴这 ...

  10. poj 3271 Lilypad Pond bfs

    因为有了1的存在,使得问题变得比较难搞了,所以比较简单的做法就是把1去掉,先做一次bfs,处理出每个点能够一步到达的点(一定是1步). 然后就可以在新图上用bfs算出两个点之间的最短路,和最短路的个数 ...