Single Pattern(单例模式)
单例模式是一种常用的软件设计模式。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的实例只能存在一个,单例模式是最好的解决方案。
iPhone SDK 中使用此模式的有很多,例如:
[UIApplication sharedApplication] 返回一个指向代表应用程序的单例对象的指针。[UIDevice currentDevice] 获取一个代表所使用硬件平台的对象。
将类方法与单例相结合,便可以在程序的任何地方通过对象方法获取单个实例,而无需使用指向对象的指针或保存它的实例变量。这里举个例子:
main.m
//
// main.m
// OCSinglePattern(单例模式)
//
// Created by Kenmu on 15/5/15.
// Copyright (c) 2015年 Kenmu. All rights reserved.
// #import <Foundation/Foundation.h>
#import "SinglePatternClass.h"
#import "SinglePatternClass2.h" int main(int argc, const char * argv[]) {
@autoreleasepool {
NSLog(@"普通方式实现单例模式");
SinglePatternClass *objA = [SinglePatternClass defaultSinglePatternClass];
objA.name = @"Kenmu的单例模式";
NSLog(@"objA.name=%@", objA.name); //objA.name=Kenmu的单例模式
SinglePatternClass *objB = [SinglePatternClass defaultSinglePatternClass];
NSLog(@"objB.name=%@", objB.name); //objB.name=Kenmu的单例模式
objB.name = @"Kenmu的单例模式,修改objB.name,看objA.name是否也跟随变化";
NSLog(@"单例模式测试%@", [objB.name isEqualToString:objA.name] ? @"成功" : @"失败"); //单例模式测试成功 NSLog(@"\n\nGCD实现单例模式");
SinglePatternClass2 *objC = [SinglePatternClass2 sharedSinglePatternClass2];
objC.name = @"Kenmu的单例模式";
NSLog(@"objC.name=%@", objC.name); //objC.name=Kenmu的单例模式
SinglePatternClass2 *objD = [SinglePatternClass2 sharedSinglePatternClass2];
NSLog(@"objD.name=%@", objD.name); //objD.name=Kenmu的单例模式
objB.name = @"Kenmu的单例模式,修改objD.name,看objC.name是否也跟随变化";
NSLog(@"单例模式测试%@", [objD.name isEqualToString:objC.name] ? @"成功" : @"失败"); //单例模式测试成功
}
return ;
}
SinglePatternClass.h
#import <Foundation/Foundation.h> @interface SinglePatternClass : NSObject
@property (strong, nonatomic) NSString *name; /**
* 普通方式实现单例模式
*
* @return SinglePatternClass单例
*/
+ (SinglePatternClass *)defaultSinglePatternClass;
@end
SinglePatternClass.m
#import "SinglePatternClass.h" static SinglePatternClass *singleObj = nil;
@implementation SinglePatternClass
+ (SinglePatternClass *)defaultSinglePatternClass {
@synchronized(self) { //这里用@synchronized实现锁,其实还可以用其他方式实现锁;例如:NSLock和C语言的pthread_mutex_t、GCD的dispatch_semaphore_t(信号量)
if (!singleObj) {
singleObj = [[SinglePatternClass alloc] init]; //这里alloc方法会调用allocWithZone:方法
}
return singleObj;
}
} + (id)allocWithZone:(struct _NSZone *)zone {
@synchronized(self) {
if (!singleObj) {
singleObj = [super allocWithZone:zone];
return singleObj;
}
}
return nil;
}
@end
SinglePatternClass2.h
#import <Foundation/Foundation.h> @interface SinglePatternClass2 : NSObject
@property (strong, nonatomic) NSString *name; /**
* GCD实现单例模式
*
* @return SinglePatternClass2单例
*/
+ (SinglePatternClass2 *)sharedSinglePatternClass2;
@end
SinglePatternClass2.m
#import "SinglePatternClass2.h" @implementation SinglePatternClass2
+ (SinglePatternClass2 *)sharedSinglePatternClass2 {
static SinglePatternClass2 *singleObj2; static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{ //第一个参数&onceToken是用于检查代码块是否被调用过的谓词,第二个参数是具体执行内容的代码块。dispatch_once方法中的代码块只会被执行一次,而且还是线程安全的
singleObj2 = [[SinglePatternClass2 alloc] init];
});
return singleObj2;
}
@end
1、synchronized 这个主要是考虑多线程的程序,这个指令可以将{ } 内的代码限制在一个线程执行,如果某个线程没有执行完,其他的线程如果需要执行就得等着。
2、allocWithZone 这个是重载的,因为这个是从制定的内存区域读取信息创建对象实例,所以如果需要的对象实例已经存在了,就需要禁止修改当前对象实例,所以返回 nil。
Single Pattern(单例模式)的更多相关文章
- 第1章 单例模式(Single Pattern)
原文 第1章 单例模式(Single Pattern) 单例模式就是保证在整个应用程序的生命周期中,在任何时刻,被指定的类只有一个实例,并为客户程序提供一个获取该实例的全局访问点. 一.常用模式: 1 ...
- 创建型模式篇(单例模式Single Pattern)
一.单例模式(Singleton Pattern) 单例模式要求一个类只能有一个实例,并且提供了一个全局的访问点. 比如说,中国主席的职位是Singleton,法律规定主席选举,任何时间只能有一个主席 ...
- Singleton Pattern单例模式
单例模式是一种对象创建模式,它用于产生一个对象的具体实例,它可以确保系统中一个类只产生一个实例.Java里面实现的单例是一个虚拟机的范围,因为装载类的功能是虚拟机的,所以一个虚拟机在通过自己的 Cla ...
- c# 单例模式(Single);单例模式的5种写法
单例模式(Singleton Pattern): 在平时的开发中,可能会用到单例模式,许多java的笔试题中也会叫笔试者写出单例模式的那几种写法并且分析.那么下面就来轻轻地探讨一下,最简单的设计模式, ...
- Python Singleton Pattern(单例模式)
简介 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. 当 ...
- Singleton Pattern(单例模式)
1.简介 单例模式,顾名思义,即在整个系统中,类的实例对象只有一个. 单例模式具有以下特点: 单例类只能有一个实例 单例类必须自己创建自己的唯一实例 单例类必须给所有其他对象提供这一实例 2.实现 其 ...
- Java中的单例模式(Singleton Pattern in Java)
Introduction 对于系统中的某个类来说,只有一个实例是很重要的,比如只有一个timer和ID Producer.又比如在服务器程序中,配置信息保留在一个文件中,这些配置信息由一个单例对象统一 ...
- Singleton Pattern -- 不一样的单例模式
Singleton Pattern -- 单例模式 单例模式是用来创建一个只能又一个实例的对象. 单例模式类图如下. 单例模式有两大好处: (1)对于频繁使用的对象,可以省略创建对象所话费的时间,这对 ...
- JavaScript设计模式学习之单例模式
一.单例模式介绍 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问, ...
随机推荐
- 知道创宇研发技能表v2.1
创建时间:2012/12/1 2013/4/26 公开发布 2013/7/15 新增:牛人1,2,3 2013/7/20 优化:成长,增加:小事心态.任务拆分.方法论 2013/8/12 更新:Web ...
- Phrase-Based & Neural Unsupervised Machine Translation基于短语非监督机器翻译
1. 前言 本文介绍一种无监督的机器翻译的模型.无监督机器翻译最早是<UNSUPERVISED NEURAL MACHINE TRANSLATION>提出.这个模型主要的特点,无需使用平行 ...
- virtualbox问题收集
The VM session was closed before any attempt to power it on. 返回 代码:E_FAIL (0x80004005)组件:SessionMach ...
- virtualbox 安装 USB 扩展功能
virtualbox USB 扩展包下载 扩展包下载地址: http://download.virtualbox.org/virtualbox/ 选择你的 virtualbox 版本 看版本在 vir ...
- sam9260 adc 测试
/* * adc_test.c * * Copyright (C) 2007 Mengrz */ #include <stdio.h> #include <stdlib.h> ...
- Java编程的逻辑 (74) - 并发容器 - ConcurrentHashMap
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...
- Java编程的逻辑 (46) - 剖析PriorityQueue
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...
- vs自己主动生成的WebService配置文件在部署到IIs6后,服务调用失败的解决方法
近日.在项目中须要引用java公布的WebService,加入服务引用后,调用一切正常. 配置例如以下: <system.serviceModel> <bindings> &l ...
- JSON的简单介绍以及C语言的JSON库使用
JSON概述 JSON: JavaScript 对象表示法( JavaScript Object Notation) .是一种轻量级的数据交换格式. 它基于ECMAScript的一个子集. JSON采 ...
- Idea maven项目不能新建package和class的解决
如图,新建的maven项目不能新建package 这是因为Java是普通的文件夹,要设置为 现在就可以了