单例

转载 2015年11月20日 21:45:33
第一部分: 创建一个

 

单例的应用场景:

单例模式用于当一个类只能有一个实例的时候, 通常情况下这个“单例”代表的是某一个物理设备比如打印机,或是某种不可以有多个实例同时存在的虚拟资源或是系统属性比如一个程序的某个引擎或是数据。用单例模式加以控制是非常有必要的。

什么是单例模式?

单例是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。

(一

 

单例设计模式需要达到下面几个目的:1.)封装一个共享的资源; 2.)提供一个固定的实例创建方法; 3.)提供一个标准的实例访问接口

 

常用的定义单例的方法(ARC+GCD)

 

01.//实现一个创建单例对象的类方法
02. 
03.static ClassType *objName = nil; 
04. 
05.+ (ClassType *) sharedInstance{
06.static dispatch_once_t oneToken = 0;
07.dispatch_once(&onceToken, ^{
08.objName = [[super allocWithZone: NULL] init];
09.});
10.return objName; 
11.}
12. 
13.//重写几个方法,防止创建单例对象时出现错误
14.-(id) init{
15.If(self = [super init])
16.{
17.//初始化单例对象的各种属性
18.}
19.return self;
20.}
21. 
22.+(id)allocWithZone: (struct _NSZone *) zone{
23.return [self sharedInstance];
24.}
25. 
26.//这是单例对象遵循<NSCopying>协议时需要实现的方法
27.-(id) copyWithZone: (struct _NSZone *)zone{
28.return self;
29.}

第二部分:就地取材使用UIApplication单例

直接在AppDelegate中创建实例变量,然后在项目的其他文件中使用这些变量。

1.AppDelegate *appDelegate = (AppDelegate *)[[UIApplication shareApplication] delegate];
2.appDelegate.a = 10086;
3.appDelegate.globalString = @”中国想联通’;

 

这样,你可以定义一个全局实例变量。

详细请参考:http://blog.csdn.net/casablaneca/article/details/21074413

第三部分:在项目中使用单例设计模式

项目描述:我们希望通过一个button的点击事件触发单例对象中的一个属性值发生变化,然后使用KVO在ViewController的两个子视图(LeftView, RightView)上监听这个属性值得变化,并将变化后的数值在LeftView和RightView上显示出来。

 

1.) 在ViewController上设置一个button和一个触发事件

1.-(IBAction) refreshData: (id) sender{
2.//stockForKVO为单例对象
3.stockForKVO.price = arc4random()%100;
4.}

2.) 在LefeView和RightVIew的对象中使用KVO监听单例对象中属性值的变化

01.stockForKVO = [StockData sharedInstance];
02.[stockForKVO addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
03. 
04.//实现回调方法
05.- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void*)context{
06.if ([keyPath isEqualToString:@"price"]) {
07.showLabel.text = [NSString stringWithFormat:@"%f",stockForKVO.price];
08.NSLog(@" left change: %@", change);
09.}
10.}

3.)实现后的效果如图2所示

 

(图2),




 

图2: 下边为button事件触发后的场景,上边为初始化时的场景

C# 简单的泛型单例

使用Where 约束,new()约束 让编译器知道,提供的任何类型参数都具有默认构造函数。也只有加了这个约束之后,才能使用 new T() ;...
  • cp790621656
  • cp790621656
  • 2016年01月14日 10:30
  • 1570

【单例深思】枚举实现单例原理

单例的枚举实现在《Effective Java》中有提到,因为其功能完整、使用简洁、无偿地提供了序列化机制、在面对复杂的序列化或者反射攻击时仍然可以绝对防止多次实例化等优点,单元素的枚举类型被作者认为...
  • Insert_day
  • Insert_day
  • 2017年04月26日 20:49
  • 1453

关于单例--为什么用以及什么时候用

很早之前就听说过单例模式,但是一直没有使用过,因为我一直都不知道为什么要用单例模式,单例模式该用在哪些情况,直到最近看到一篇东西我才明白。以下,把我的一些理解记录下来,供自己以及跟我一样有所困惑的人作...
  • liulushi_1988
  • liulushi_1988
  • 2012年12月28日 14:48
  • 2319

Java 利用枚举实现单例模式

引言单例模式比较常见的实现方法有懒汉模式,DCL模式公有静态成员等,从Java 1.5版本起,单元素枚举实现单例模式成为最佳的方法。Java枚举基本用法枚举的用法比较多,本文主要旨在介绍利用枚举实现单...
  • yy254117440
  • yy254117440
  • 2016年08月24日 23:50
  • 18469

内部类——实现单例

使用内部类方式实现单例,既可以做到延迟加载,有不必使用同步关键字,是一种比较完善的实现 ——Java程序性能优化 延迟加载:StaticSingleton类被加载时,不会执行内部类的方法,因而,不会...
  • wangqingbo0829
  • wangqingbo0829
  • 2016年03月07日 15:20
  • 804

swift 单例传值及其使用方式

//声明一个单例 SwiftSingleton.swift import UIKit class SwiftSingleton: NSObject {      /...
  • WUYANYANstrong
  • WUYANYANstrong
  • 2016年09月23日 14:29
  • 314

单例模式下的可伸缩的数据库连接池的实现

使用数据库连接池的原因及优势        JDBC做为一种数据库访问技术,具有简单易用的优点。但在程序开发时,不使用数据库连接池的情况下,系统会存在诸多问题如:每一次Web请求都要建立依次数...
  • zhangjinpeng66
  • zhangjinpeng66
  • 2013年08月27日 21:34
  • 1313

【设计模式】单例模式的绝对单例及线程安全

一、饿汉模式/** * 饿汉模式 * @author 郑海鹏 * @since 2015年7月6日 */ public class Singleton { private static...
  • H28496
  • H28496
  • 2015年11月17日 10:44
  • 2171

单例类和单例注册表的实现

1,单例类的实现. 可以保证在非同时多线程多类加载器的环境下的单例public class Singleton...{    private static Singleton instance;   ...
  • caoyinghui1986
  • caoyinghui1986
  • 2008年05月22日 05:56
  • 3214

单例模式的泛型实现 C#

当开发人员想将一个类以单例模式实现时,可以在类中定义。 当时如果
  • wuha555
  • wuha555
  • 2014年11月10日 17:20
  • 7534
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:单例
举报原因:
原因补充:

(最多只允许输入30个字)