保证一个类仅有一个实例:单例模式

简介:

场景:微软的windows xp操作系统,ctrl+alt+del键都会弹出一个windows任务管理器(这时不关闭这个任务管理器),继续ctrl+alt+del键还是一个windows任务管理器。鉴于本人水平有限,上面的场景举例可能不合适,但是很接近一个基本的设计模式:单例模式。Code is cheap.下面用c#代码模拟出一个类似任务管理器的创建:

ContractedBlock.gif Code
上面创建实例的基本思想是new一个对象的时候,判断静态的类变量是否已经有实例,构造函数私有,这样外部代码不能直接new来实例化对象。这是因为我们都知道所有类都有构造函数,不编码写构造函数则系统默认生成无参数的构造方法,但如果有显式定义的构造方法,默认的就会失效。ps:在定义可序列化的类的时候,默认构造函数是必须的,所以如果你显式定义了一个带参数的构造方法,一定不能忘记要再写一个没有参数的构造方法。
好了,上面的代码ms已经简单的实现了对唯一实例的受控访问。不过在多线程的程序中,上面的代码会有可能创建多个实例的。给进程加把锁,用lock解决一下:
ContractedBlock.gif Code
上面那种做法可以创建单一实例,可是每次调用创建方法时,都要lock,影响性能,有一种双重锁定的方法:
ContractedBlock.gif Code
最后再看一个所谓的饿汉式单例类:
ContractedBlock.gif Code



本文转自JeffWong博客园博客,原文链接:http://www.cnblogs.com/jeffwongishandsome/archive/2009/03/14/1411570.html ,如需转载请自行联系原作者
目录
相关文章
|
2月前
|
设计模式 缓存 安全
【设计模式】单例模式:确保类只有一个实例
【设计模式】单例模式:确保类只有一个实例
23 0
|
4月前
|
C++
C++实现单例模式-多种方式比较
单例模式,面试中经常被问到,但是很多人只会最简单的单例模型,可能连多线程都没考虑到,本文章从最简单的单例,到认为是最佳的单例模式实现方式,单例模式没有什么知识点,直接上源码
50 0
|
7月前
|
设计模式 安全 Java
JAVA设计模式1:单例模式,确保每个类只能有一个实例
JAVA设计模式1:单例模式,确保每个类只能有一个实例
|
6月前
|
设计模式 存储 安全
八种创建单例模式的方式-懒汉式与饿汉式及枚举
八种创建单例模式的方式-懒汉式与饿汉式及枚举
81 2
|
3月前
|
设计模式 缓存 安全
单例模式的应用与陷阱:确保你的代码只有一个实例
单例模式的应用与陷阱:确保你的代码只有一个实例
77 0
|
9月前
|
安全 Java 编译器
单例模式的4种实现方式
单例模式的4种实现方式
74 0
|
9月前
|
设计模式 存储 安全
单例模式:保证唯一性的设计模式
当谈到Java设计模式时,"单例模式"是一个不可忽视的主题,它是创建型设计模式中的一员。在本文中,我们将深入探讨"单例模式"的一个常见实现方式——"懒汉式"。我们将了解什么是懒汉式单例模式,为什么需要它,以及如何在Java中实现它。
53 0
|
缓存
单例模式(5种实现方式)
单例模式(5种实现方式)
112 0
|
设计模式
单例模式的懒汉模式为什么在高并发中会出现问题?一个代码例子告诉你
单例模式的懒汉模式为什么在高并发中会出现问题?一个代码例子告诉你
单例模式的懒汉模式为什么在高并发中会出现问题?一个代码例子告诉你
|
SQL Java
解决单例模式中懒汉式不支持高并发,饿汉式不支持懒加载问题最简单方法——基于枚举类型的单例实现
解决单例模式中懒汉式不支持高并发,饿汉式不支持懒加载问题最简单方法——基于枚举类型的单例实现
129 0
解决单例模式中懒汉式不支持高并发,饿汉式不支持懒加载问题最简单方法——基于枚举类型的单例实现