首页 > 技术文章 > 单例模式

Johar 2018-05-13 00:52 原文

单例模式,顾名思义,确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。单例模式,是所有模式中最简单的,也是最常用的软件模式之一。不管是在我们的实际的软件开发过程中,还是找工作面试的时候,经常会用到。进行客户端开发,经常会用到一些启动参数,例如服务器的ip,端口,用户名,session之类的,需要在整过项目中经常用到,所以在这种情况下,我会把用单例模式来解决这个问题。简单看一下代码:

 1 public class AppStartupParam
 2     {
 3         private AppStartupParam() { }
 4 
 5         private static AppStartupParam instance = null;
 6         private static readonly object locker = new object();
 7 
 8         public static AppStartupParam Instance
 9         {
10             get
11             {
12                 if (instance == null)
13                 {
14                     lock(locker)
15                     {
16                         if (instance == null)
17                         {
18                             instance = new AppStartupParam();
19                         }                        
20                     }
21                 }
22 
23                 return instance;
24             }
25         }
26 
27         public string ServerIP { get; set; }
28 
29         public int ServerPort { get; set; }
30 
31         public string UserName { get; set; }
32 
33         public string Session { get; set; }
34     }

上面的代码很简单,是单例模式的一种实现方法,叫饿汉双校验锁式单例模式,值得注意的地方有两个地方:

1.一个类若是只能创建一次,必须用一个私有的构造器来取代默认公共的构造器,从而使该类不能随意创建实例,我一开始用的时候经常把这个私有构造函数漏掉,虽然不影响实际使用,但是没有私有构造函数,就称不上是单例模式。

2.在第一次检查instance是否为null,如果为null,则进入同步锁,再次判断instance是否为null,如果为null,则创建实例。加锁是考虑到多线程同步的问题,第一次检查实例是因为绝大数情况下,只需要同步锁外面判断一下就可以了,提高了系统的性能,缩短耗时。

简单总结一下,单例模式的优点,缺点,使用场景:

优点:

1.减少内存开支,特别需要频繁创建,销毁对象时,优势明显
2.减少性能开销
3.避免对资源的多重占用,如读写文件
4.设置全局的访问点,优化和共享资源访问

缺点:

1.一般没有接口,拓展困难
2.与单一职责原则冲突

使用场景:

1.要求生成唯一序列化的环境
2.整个项目中需要一个共享访问点或共享数据
3.创建一个对象需要消耗的资源过多,如访问IO或数据库等资源
4.定义大量的静态常量和静态方法,如工具类

推荐阅读