01-11 单例模式

  1. +(Dlpontlerexple*)shareIndence

    {

    static Dlpontlerexple *dil = nil;

    if (dil==nil) {

    dil = [[[Dlpontlerexple class]alloc]init];

    }

    return dil;

    }

  2. +(Dlpontlerexple *)shareIndence;
  3. 理解

    单例(单态)模式

    单例设计模式确保对于一个给定的类只有一个实例存在,这个实例有一个全局唯一的访问点。它通常采用懒加载的方式在第一次用到实例的时候再去创建它。

    注意:苹果大量使用了此模式。例如:[NSUserDefaults standardUserDefaults], [UIApplication sharedApplication], [UIScreen mainScreen], [NSFileManager defaultManager],所有的这些方法都返回一个单例对象。

    你很可能会想为什么这么关心是否一个类有多个实例?毕竟代码和内存都是廉价的,对吗?

    有一些情况下,只有一个实例显得非常合理。举例来说,你不需要有多个Logger的实例,除非你想去写多个日志文件。或者一个全局的配置处理类:实现线程安全的方式访问共享实例是容易的,比如一个配置文件,有好多个类同时修改这个文件。

    如何使用单例模式

    首先来看看下面的图:

    上面的图描述了一个有单一属性(它就是单一实例)和sharedInstance,init两个方法的类。

    客户端第一次发送sharedInstance消息的时候,instance属性尚未被初始化,所以此时你需要创建一个新的实例,然后返回它的引用。

    当你下一次调用sharedInstance的时候,instance不需要任何初始化可以立即返回。这个逻辑保证总是只有一个实例。

    你接下来将用这个模式来创建一个管理所有专辑数据的类。

    你将注意到工程中有一个API的组,在这个组里你可以放入给你应用提供服务的所有类。在此组中,用IOS\Cocoa Touch\Objective-C class 模板创建一个新类,命名它为LibraryAPI,设置父类为NSObject.

    打开LibraryAPI.h,用如下代码替换它的内容

    1. @interfaceLibraryAPI : NSObject
    2. + (LibraryAPI*)sharedInstance;
    3. @end

    现在打开LibraryAPI.m,在@implementation 那一行后面插入下面的方法:

    1. + (LibraryAPI*)sharedInstance
    2. {
    3. // 1
    4. static LibraryAPI *_sharedInstance = nil;
    5. // 2
    6. static dispatch_once_t oncePredicate;
    7. // 3
    8. dispatch_once(&oncePredicate, ^{
    9. _sharedInstance = [[LibraryAPI alloc] init];
    10. });
    11. return _sharedInstance;
    12. }

    在这个简短的方法中,有一些需要需要注意的点:

    1.声明一个静态变量去保存类的实例,确保它在类中的全局可用性。

    2.声明一个静态变量dispatch_once_t ,它确保初始化器代码只执行一次

    3.使用Grand Central Dispatch(GCD)执行初始化LibraryAPI变量的block.这  正是单例模式的关键:一旦类已经被初始化,初始化器永远不会再被调用。

    下一次你调用sharedInstance的时候,dispatch_once块中的代码将不会执行(因为它已经被执行了一次),你将得到原先已经初始化好的实例。

    注意: 为了学习更多关于GCD方面的信息以及如何使用,请查看本站指南Multithreading and Grand Central Dispatch 和 How to Use Blocks

时间: 2024-10-12 14:28:20

01-11 单例模式的相关文章

接口2014年6月11日01:11:37

1 [1]C#中的接口和类有什么异同. 2 3 不同点: 4 不能直接实例化接口. 5 接口不包含方法的实现. 6 接口可以多继承,类只能单继承. 7 类定义可在不同的源文件之间进行拆分(partial). 8 9 相同点: 10 接口.类和结构都可以从多个接口继承. 11 接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员. 12 接口和类都可以包含事件.索引器.方法和属性(属性本质上是两个方法). 13 14 基础知识:接口只能定义方法(只能定义行为,不能定义实现也就是字段

C++11单例模式,另附C++11令CPU占用率为sin曲线

C++11 单例模式 对于C++11来说,单例模式就是这样简单!请看代码. <span style="font-size:14px;">#include <iostream> #include <ratio> #include <chrono> #include <thread> #include <cmath> using namespace std; template <typename T> cl

2016.01.22 单例模式(Singleton)

单例模式:整个程序的一个类只能有一个实例对象:(UIApplication.NSUserDefaults等都是IOS中的系统单例) 1.物理设备 eg:打印机 2.不可多个同时存在的资源 eg:数据库 单例的写法: 这是第一种,也是最简单.最常用的一种: 1 #import "FileOpration.h" 2 3 static FileOpration *instance = nil; //静态变量,从定义开始到整个程序结束 4 5 @implementation FileOprat

01设计模式——单例模式

前言:以下总结来自龙哥---左潇龙博客. 总结的很到位,附上博客链接:http://www.cnblogs.com/zuoxiaolong/p/pattern2.html 目的:尽可能的节约内存空间,减少无谓的GC消耗,并且使应用可以正常运作. 如何判断单例:这些类,在应用中如果有两个或者两个以上的实例会引起错误,又或者我换句话说,就是这些类,在整个应用中,同一时刻,有且只能有一种状态. 1 /** 2 * 简单单例模式 3 * 目的,是为了尽可能的节约内存空间,减少无谓的GC消耗,并且使应用可

Java学习不走弯路教程(11 单例模式2(单实例类))

单例模式2(单实例类) 一. 前言 在前上一章教程中,介绍了静态方法的伪单例模式.本章将在上一章的基础上,进一步扩展程序. 注:1.本文针对初学Java的同学训练学习思路,请不要太纠结于细节问题.2.本文旨在达到抛砖引玉的效果,希望大家扩展本例子,以学到更多知识的精髓. 学习本章需要准备的知识:1.读完本系列教程的前面章节.2.理解单例模式. 二. 步入正题话不多说,大家自己理解,下面步入正题: 静态方法虽然能满足我们的需求,但他牺牲了面向对象对程序带来的扩展性,比如AOP等.本章我们讨论对单实

以 “日” 为单位的可以翻页的效果 显示为 2016/01/11

先上效果图: 动作和“周”是一样的,步骤简化,: 一.日期容器html <!--日期的容器--> <div class="headerDiv"> <div id="previousDiv" class="previousImgDiv"></div> <div id="nextDiv" class="unNextImgDiv" ></div&g

Cheatsheet: 2015 11.01 ~ 11.30

Golang Roadomatic: Node vs. Go Quick Guide to Golang for Java Developers 3 Go Gotchas Web Choosing a Front End Framework: Angular vs. Ember vs. React Microservices Decoded: Best Practices and Stacks Mastering ASP.NET 5 without growing a beard 5 Tips

ygRan Java1.0-1.11各个版本的新特性

JDK Version 1.01996-01-23 Oak(橡树) 初代版本,伟大的一个里程碑,但是是纯解释运行,使用外挂JIT,性能比较差,运行速度慢. JDK Version 1.11997-02-19 JDBC(Java DataBase Connectivity);支持内部类;RMI(Remote Method Invocation) ;反射;Java Bean;JDK Version 1.21998-12-08 Playground(操场) 集合框架;JIT(Just In Time)

Daily Recording 2020/01/11 (关键词:ARP,计算机网络基础)

Daily Recording Wang yuan can January 11, 2020 @雨人网安 日报 日报开始 今天是周六,持续六天的高强度学习迎来了“伟大的休息日”,今天的学习内容相对轻松,刚开始Bai在讲计算机网络基础的时候希望通过小视频的方式让我们来了解,后面越看越跑题了,原子弹制造.高铁运作流程.飞机票出票流程......,就这样,我们在bilibili看一上午有趣的小视频.下午Bai带着我们阅读了一个关于“内网渗透”的博文,讲的是博主如何渗透进蹭自己家wifi的人的电脑,后面

2016/01/11开始学习git:查看仓库状态和修改文件

1.使用git status查看版本库的状态 $ git statusOn branch masternothing to commit, working directory cleanGit告诉我们当前没有需要提交的修改,而且,工作目录是干净(working directory clean)的. 2.现在去修改readme.txt的内容 原本内容为: Git is a version control system.Git is free software. 修改后: Git is distri