单例模式
单例模式,顾名思义,确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。单例模式,是所有模式中最简单的,也是最常用的软件模式之一。不管是在我们的实际的软件开发过程中,还是找工作面试的时候,经常会用到。进行客户端开发,经常会用到一些启动参数,例如服务器的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.定义大量的静态常量和静态方法,如工具类