单例模式是一种比较常见的设计模式,比如symbian中的App,可以作为一个共享存储变量的类供所有view使用,避免使用全局变量,其主要作用有:
第一、控制资源的使用,通过线程同步来控制资源的并发访问,以防同一时间modify资源而造成数据不统一等内容;
第二、控制实例产生的数量,达到节约资源的目的。
第三、作为通信媒介使用,也就是数据共享,它可以在不建立直接关联的条件下,让多个不相关的两个线程或者进程之间实现通信。
数据库连接池的设计一般采用单例模式,数据库连接是一种数据库资源。通过遍历数据库连接池来获得数据库连接对象,如果有那么就可以省去连接数据库的操作而浪费掉的时间。软件系统中使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗,这种效率上的损耗还是非常昂贵的。当然,使用数据库连接池还有很多其它的好处,可以屏蔽不同数据数据库之间的差异,实现系统对数据库的低度耦合,也可以被多个系统同时使用,具有高可复用性,还能方便对数据库连接的管理等等。数据库连接池属于重量级资源,一个应用中只需要保留一份即可,既节省了资源又方便管理。所以数据库连接池采用单例模式进行设计会是一个非常好的选择。
在我们日常使用的在Windows中也有不少单例模式设计的组件,象常用的文件管理器。由于Windows操作系统是一个典型的多进程多线程系统,那么在创建或者删除某个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象。采用单例模式设计的文件管理器就可以完美的解决这个问题,所有的文件操作都必须通过唯一的实例进行,这样就不会产生混乱的现象。
再比如,每台计算机可以有若干个打印机,如果每一个进程或者线程都独立地使用打印机资源的话,那么我们打印出来的结果就有可能既包含这个打印任务的一部分,又包含另外一个打印任务的一部分。所以,大多数的操作系统最终为打印任务设计了一个单例模式的假脱机服务Printer Spooler,所有的打印任务都需要通过假脱机服务进行。
实际上,配置信息类、管理类、控制类、门面类、代理类通常被设计为单例类。像Java的Struts、Spring框架,.Net的Spring.Net框架,以及Php的Zend框架都大量使用了单例模式。
单例模式需要注意的问题:
1.lock,单例模式在多线程访问的时候还是有可能出现实例化多个对象的情况,此时需要实现lock对象的操作,这样在一个线程进入判断单例是否实例化的时候如果有另外一个线程也要访问,那么必须等待到第一个线程释放对象资源,才可以进入,而又没有必要每次都要锁定对象,那么使用双重锁定来实现单例模式。(这个过程中有关单例的死锁,我一直没弄明白,现在自己就了解锁定多个资源的时候,多线程如果加锁和释放的顺序不一样的话,会造成循环等待资源释放,造成死锁,有了解单例死锁的请劳烦跟小弟讲一下)
2.懒汉initialize instance和饿汉式实例化单例对象,两种initialize都可以,不过饿汉式是在加载类的时候就进行初始化实例,而懒汉是在get instance的时候才会对实例进行initialize。
单例模式实现存储资源配置文件信息:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DesignPattern { class SingletonPattern { private string dataname; private string datapwd; public string Dataname { get { return dataname; } set { dataname = value; } } public string Datapwd { get { return datapwd; } set { datapwd = value; } } private SingletonPattern() { } private static readonly object aObject = new object(); private static SingletonPattern aSingle; public static SingletonPattern GetSingleton() { if(aSingle == null) lock (aObject) { if (aSingle == null) { aSingle = new SingletonPattern(); aSingle.Dataname = System.Configuration.ConfigurationSettings.AppSettings["dataname"].ToString(); aSingle.Datapwd = System.Configuration.ConfigurationSettings.AppSettings["datapwd"].ToString(); } } return aSingle; } } class Program { static void Main(string[] args) { Console.WriteLine("dataname:" + SingletonPattern.GetSingleton().Dataname); Console.WriteLine("datapwd:" + SingletonPattern.GetSingleton().Datapwd); Console.ReadKey(); } } }
初涉设计模式,请大家多多指正错误和不足。。。。
转载请注明出处:Edward_jie,http://www.cnblogs.com/promise-7/archive/2012/05/22/2513302.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库