一 何为单例singleton模式?(what)

保证一个类只有一个实例,并提供一个访问它的全局访问点。

二 何时使用单例模式?(where)

1类只能有一个实例,而且必须从一个为人熟知的访问点对其访问,比如工厂方法。

2这个唯一实例只能通过子类化进行扩展,而且扩展的对象不会破坏客户端代码。

为什么不用静态全局变量或是类方法呢?

如果一个程序中两个人分别在两个地方定义了相同类型的静态变量。那么一个程序中就会有两个相同的全局对象类型。

类方法提供了共享服务,不用创建其对象就可以访问,资源的唯一实例可以在类方法中进行维护。但是如果累需要被子类化以提供更好的服务,这一方式就不灵活。

三 实现单例模式 (how)

static Singleton *sharedSingleton_=nil;

+(Singleton *)sharedInstance

{

  if(sharedSingleton_==nil){
    sharedSingleton = [[Singleton alloc]init];

  }

  return sharedSingleton_;

}

需克服问题:

发起调用的对象不能以其他方式实例化单例对象。否则就可能创建单例类的多个实例。

对单例对象实例化的限制应该与引用计数内存模型共存。

解决:

static Singleton *sharedSingleton_=nil;

+(Singleton *)sharedInstance

{

  if(sharedSingleton_==nil){
    sharedSingleton = [[super allocWithZone:NULL]init];

  }

  return sharedSingleton_;

}

用super的原因是,已经在self中重载了基本对象分配方法,需要借用父类来帮助处理底层内存分配的复杂任务

+(id)allocWithZone:(NSZone *)zone

{

  return [[self sharedInstance] retain];//为什么retain,是有了把Singleton类变得不太严格的一种选择(即允许分配与初始化额外的实例,但shareInstance工厂方法总是返回同一个实例,否则singleton对象可能被破坏)子类可以再次重载retain、release和autorelease方法,实现合适的内存管理。

}

- (id)copyWithZone:(NSZone *)zone

{

  return self;

}

- (NSUInteger)retain

{

  return self;

}

- (NSUInteger)retainCount

{

  return NSUIntegerMax;//4294967295

}

- (void)release

{  

//生么也不做

}

- (id)autorelease

{

  return self;

}

alloc使用设为NULL的zone来调用allocWithZone:在默认区域为新实例分配内存。

四 子类化单例

如果用以上的方法,不做修改的子类化Singleton时,返回的实例总是Singleton,因为Singleton重载了所有实例化相关的方法。

解决方法:

+(Singleton *)sharedInstance

{

  if(sharedSingleton_==nil){
    sharedSingleton = [NSAllocateObject([self class],0,NULL) init];

  }

  return sharedSingleton_;

}

第一个参数是类型,第二个参数是用于索引实例变量的额外字节数总是0,第三个参数用于指定内存中分配的区域一般为NULL表示默认区域。可以通过指定类的类型,用这个函数实例化任何对象。

五 还要注意单例对象的线程安全

@synchoronized()或NSLock或是dispatch_once

OC编程之道-创建对象之单例模式的更多相关文章

  1. OC编程之道-创建对象之抽象工厂方法

    定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类.       <AbstractProductA> <AbstractProductB> <Ab ...

  2. OC编程之道-创建对象之工厂方法

    一 何为工厂方法模式?(what) 定义创建对象的接口,让子类决定实例化哪一个类,工厂方法是的一个类的实例化延迟到其子类. 工厂方法创建的对象拥有一组共同的行为,所以往类层次结构中引入新的具体产品并不 ...

  3. OC编程之道-创建对象之原型模式

    一 什么是原型模式?(what) 有些对象的创建代价过大或过于复杂,要是可以重建相同的对象并作轻微的改动,事情会容易的多(效率变高).典型的例子是复制组合结构(eg树形结构),从零开始构建一个树型组合 ...

  4. OC编程之道-创建对象之生成器模式

    生成器模式也叫建造者模式,一般是用来构造复杂对象的一种模式.client(客户)-director(指导者)-builder(构造者)-product(产品). 生成器模式能帮助构建设计部件与表现的各 ...

  5. OC编程之道-接口适配之适配器

    已有的类与新的接口之间不兼容的问题相当普遍,人们已为它找到了一个解决方案.这个解决方案就是适配器. 1 何为适配器 what 适配器的主要作用是把被适配者的行为传递给管道另一端的客户端. 将一个类的接 ...

  6. Java并发编程75道面试题及答案

    1.在java中守护线程和本地线程区别? java中的线程分为两种:守护线程(Daemon)和用户线程(User). 任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon( ...

  7. Python灰帽子:黑客与逆向工程师的Python编程之道|百度网盘免费下载|新手黑客入门

    百度网盘免费下载:Python灰帽子:黑客与逆向工程师的Python编程之道 提取码:tgpg 目录  · · · · · · 第1章 搭建开发环境 11.1 操作系统要求 11.2 获取和安装Pyt ...

  8. PHP 面向对象编程和设计模式 (3/5) - 单例模式和工厂模式

    PHP高级程序设计 学习笔记 2014.06.11 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容 ...

  9. iOS书摘之Objective-C编程之道 iOS设计模式解析

    来自<Objective-C编程之道iOS设计模式解析>一书的摘要总结 一.Prototype 原型模式 定义:使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象.(<设 ...

随机推荐

  1. Java程序片段

    下面是20个非常有用的Java程序片段,希望能对你有用. 1. 字符串有整型的相互转换 ? 1 2 String a = String.valueOf(2);   //integer to numer ...

  2. 【原】Learning Spark (Python版) 学习笔记(二)----键值对、数据读取与保存、共享特性

    本来应该上周更新的,结果碰上五一,懒癌发作,就推迟了 = =.以后还是要按时完成任务.废话不多说,第四章-第六章主要讲了三个内容:键值对.数据读取与保存与Spark的两个共享特性(累加器和广播变量). ...

  3. 第一章,阿里的Dubbo完美初级搭建,待续。。。

    1.1 后台工程搭建分析 Web工程. Maven的常见打包方式:jar.war.pom Pom工程一般都是父工程,管理jar包的版本.maven插件的版本.统一的依赖管理.聚合工程. Taotao- ...

  4. 详解AsyncTask的使用

    转载自:http://blog.csdn.net/liuhe688/article/details/6532519 在Android中实现异步任务机制有两种方式,Handler和AsyncTask. ...

  5. getline数据来源你的三种方式

    (1)getline从交互式的用户输入中\c中获取内容: # awk 'BEGIN {system("echo \"Input your name:\"");g ...

  6. bzoj1616

    水水啊,直接搜就行,不过bfs好像会mle(一定是我太菜了QAQ) #include<iostream> #include<algorithm> #include<cst ...

  7. ID还是普通字段做外键合适?

    ORACLE:USER表中没有ID字段,只有USERNAME做为一个唯一一字段当主键, COMMENT评论表中有一个user表的外键是用了USER表中的USERNAME字段. 我总认为这不合理,一般情 ...

  8. jQuery下拉菜单插件Tendina.

    插件效果: 下载地址和文档: https://github.com/iprignano/tendina

  9. JS控制flash的方法

    JS控制flash的一些方法:Play() ---------------------------------------- 播放动画 StopPlay()---------------------- ...

  10. 工作中的一些JS--为网页动态添加元素,类似于邮箱添加联系人的功能

    项目中要解决一个为下拉框动态添加选项的问题,之前从网上搜到结果,写个JS函数 //先新建元素,并添加属性 var option = document.createElement("optio ...