饿汉懒汉都是好汉——单例模式
来源:互联网 发布:php记录点击次数 编辑:程序博客网 时间:2024/05/01 23:44
前情回顾:
不知大家是否曾有过类似经历。在做机房收费的时候,单击菜单栏的某个按钮,click 一次便出现一次此窗体,从而导致一个主界面里出现过多相同的窗体,但理想状态是不管如何单击,一个主界面我们只想要某窗体只出现一次。此时,单例模式便可派上大用场。
计划生育,还是一个好:
懒汉单例模式:
单例模式是相对于众多模式中最严谨守法的好模式。它能保证一个类只有唯一一个对象被实例化,并只提供一个全局访问点。
具体方法是在需要单例的类中写入私有的构造方法,导致外界不能使用new创建实例。再定义一个访问本类实例的唯一一个全局访问点,从中判断此类有否被实例化过,如果没有,实例化此类。如果已经实例化,则显示已实例化对象。
具体代码如下:
Class Singleton{Private static Singleton instance;Private Singleton() //将instance构造方法设定为私有,防止对其无限实例化。{}Public static Singleton GetInstance()//写出一个全局公有的GetInstance方法,来对instance进行判断,最后访问。{If (instance==null){Instance=new Singleton();}Return instance;}}
结构图如下:
多线程时的单例:
1、锁定
在操作系统概论一书中,详细讲述了线程等概念,在此不再赘述。
多线程时,同时访问此类调用GetInstance方法,也有可能导致创建出多个实例。可以利用lock锁,让个线程有条不紊的one by one依次进入。
Class Singleton{Private static Singleton instance;Private static readonly object syncRoot=new object()//创建一个进程辅助对象。Private Singleton() {}Public static Singleton GetInstance()//{Lock (syncRoot) //加锁部分,只有一个线程可进入,别的排队等待。{If (instance==null){Instance=new Singleton();}}Return instance;}}
2、双重锁定
但是这样我们就让线程每次都给加锁,不断的重复。所以可以优化一下,先进行判断,只对没有实例化的时候再加锁处理,防止多个getinstance被调用。这就是传说中的双重锁定。
Double-check lock:
Class Singleton{Private static Singleton instance;Private static readonly object syncRoot=new object()//创建一个进程辅助对象。Private Singleton() {}Public static Singleton GetInstance()//{If (instance==null) //先判断,不存在被实例化的instance时,才进行加锁处理。{Lock (syncRoot) {If (instance==null){Instance=new Singleton();}}}Return instance;}}
懒汉静态初始化:
其实严于律己遵守国家规章制度的不只单例一人,还有一位“静态初始化”君。通过一个秘密的sealed关键字达到同样防止多生的效果。
具体实现如下:
Public sealed class Singleton{Private static readonly Singleton instance=new Singleton();Pirvate Singleton(){}Public static Singleton GetInstance()\{Return instance;}}
饿汉 vs 懒汉
至于饿汉懒汉的称谓主要来源于单例模式要在此一次被引用时,才将自己实例化,相对于静态初始化在自己一被加载的时候就积极实例化而言,表现得懒惰不积极,所以单例模式是个大懒蛋。而静态初始化方法又显得稍微有点太积极主动了,太希望实现自我价值了,早早的就给自己占了个空间。所以被称为饿汉式单例类。不过懒汉饿汉,只要遵纪守法,就是好汉。
- 饿汉懒汉都是好汉——单例模式
- 设计模式——单例模式之“饿汉模式”与“懒汉模式”
- 单例设计模式-懒汉饿汉
- 单例模式——懒汉模式和饿汉模式
- 【单例模式】——饿汉模式与懒汉模式及其区别
- 设计模式C++实现(4)——饿汉懒汉之单例模式
- 单例模式中的懒汉模式和饿汉模式
- 单例模式(饿汉模式和懒汉模式)
- 单例模式(懒汉模式、饿汉模式)
- 单例模式(懒汉模式与饿汉模式)
- 单例模式(饿汉模式、懒汉模式)
- 单例模式(饿汉模式和懒汉模式)
- 单例模式的懒汉模式和饿汉模式
- 单例模式(饿汉模式和懒汉模式)
- 单例模式之 --饿汉模式与懒汉模式
- Java 单例模式之饿汉模式 懒汉模式
- 单例模式,饿汉模式和懒汉模式
- 单例模式之饿汉懒汉模式
- 登录网络上的共享文件夹命令net详解
- 使用Log Miner恢复数据的案例一则
- oracle ora-2580 pl/sql devlopme http://www.dll-files.com/dllindex/dll-files.shtml?msvcr71
- SQL Server存储过程创建数据库
- Effective Objective-C 2.0 编写高质量iOS与OS X代码 在对象内部尽量直接访问实例变量
- 饿汉懒汉都是好汉——单例模式
- [UIApplication sharedApplication].delegate 调用全局变量
- Mac OS X下应该如何卸载软件和安装应用软件
- Java程序员笔试经典例题
- App集成支付宝
- Matlab读取和另存
- codeforces 3A Shortest path of the king
- CentOS 6.3 SVN subversion的安装与配置
- adb 端口被占用