设计模式-2、单例模式
来源:互联网 发布:淘宝图片放大镜功能 编辑:程序博客网 时间:2024/05/24 07:12
单例模式,也是非常好理解的一种设计模式。
单例,也叫单件,目的是为了保证一个类只有一个实例。当然,没使用上单例模式的时候,在代码实现时候,注意不要随便new某个对象,这…..的确可以,但很不安全。因此简单代码一处理,一个单例模式便出来了。
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace _2_单例模式{ public class SingletonInfo { private static SingletonInfo info = null; private SingletonInfo() { } public static SingletonInfo GetInfo() { if (null == info) { info = new SingletonInfo(); } return info; } } class Program { static void Main(string[] args) { // SingletonInfo info = new SingletonInfo();因为构造函数是私有的,所以编译器不给new SingletonInfo info = SingletonInfo.GetInfo();//这样就能基本保证SingletonInfo类只有一个实例,前提是没有多线程 } }}
上边的写法叫做懒汉模式,所谓懒,就是没到用它的那天,它都不肯生成个实际出来,以节约资源。然而还有另外一种差不多的写法,叫饿汉模式,则系统始终阶段它便有那么一个实际。实际上就只稍做改变
public class EagerSingletonInfo { private static EagerSingletonInfo info = new EagerSingletonInfo();//它 的静态实例,始终阶段就new出来了 private EagerSingletonInfo() { } public static EagerSingletonInfo GetInfo() { return info; } }
另外,第一段代码中还提及到所写的单例只针对没有多线程的情况,面对多线程,有较小的概率还是会不安全的。
public static SingletonInfo GetInfo() { if (null == info) {//如果两个或以上的线程同时跑到这里来,就不止得一个实例了 info = new SingletonInfo(); } return info; }
解决起来也无非加锁,做法常规则,只不过lock在开发中的不多用。
public class SingletonInfo { private static SingletonInfo info = null; private static object objHelpless = new object();//制造个没实际作用的对象出来,只为加锁 private SingletonInfo() { } public static SingletonInfo GetInfo() { if (null == info)//先不加锁判断下,如果它本身非空,每次都锁着判断,性能会下降了点 { lock (objHelpless) { if (null==info)//这时候带锁判断,安全可靠 { info = new SingletonInfo(); } } } return info; } }
现实中,用到单例模式的地方也不少,例如:web中的application、windows中的任务管理器、回收站。这些功能均需要保证只有一个实际的存在。
0 0
- 设计模式(2)-单例模式(Singleton)
- 设计模式(四)--单例模式(2)
- Java设计模式--单例模式2
- 设计模式(2)-单例模式(Singleton)
- 设计模式2:单例模式
- 2、设计模式之单例模式
- 设计模式-2-单例模式
- 设计模式-2、单例模式
- 设计模式2-单例模式
- 设计模式-单例模式(2)
- 设计模式(2)--单例模式
- 单例模式(2-设计模式)
- JAVA设计模式--单例模式2
- 设计模式------单例模式
- 设计模式------单例模式
- 设计模式-单例模式
- 设计模式 - 单例模式
- 设计模式---单例模式
- Android之基于RecycleVew的相册选择器
- OKHTTP网络请求——上传下载
- React Native Windows安卓开发所需配置
- 关闭IE开发人员工具的方法
- 返回类型是枚举
- 设计模式-2、单例模式
- [SPI] 如何在89平台不使用DMA传输大于32 byte的字节
- Creating A WPF Chat Client Server Application(一)
- gradle 入门介绍
- 快的打车架构实践
- applium学习资料
- 全局唯一订单号生成方法(参考snowflake)
- QListWidget 显示图片
- hdu 5573 Binary Tree【思维+递推】