模式说明:

保证每一个类仅有一个实例,并提供一个访问它的全局访问点(即自行实例化并向整个系统提供这个实例)。

应用场景:

1.如配置文件取值类AppConfig(本身实例化对象比较大,且没有必要实例化多个)

每一个AppConfig实例对象都封装着配置文件的内容,如果系统中有多个AppConfig实例对象,系统中就会同时存在多份配置文件的内容,这样会严重浪费内存资源。如果配置文件内容比较多,多个实例对于系统资源的浪费就会更大。事实上,对于AppConfig这种类,在运行期间,一个实例对象就足够了。

2.如交易匹配类TradeMatchCore(单个类中需要共享成员变量,多个实例无法做到)

交易匹配类TradeMatchCore,负责系统交易和外部交易的匹配,调用该方法的场景有,a.定时服务 b.客户端手工调用 c.交易成交确认后自动调用。

而该类维护了一个成员变量_maxID,标记上次匹配成功的外部交易的最大ID。如果每个调用地方都实例化一个TradeMatchCore对象,即每个对象都维护了一个单独的_maxID值,如果上述三个地方的该值不一致,就会对匹配照成问题。

模式应用:

单例模式有两种实现方式,一种称为懒汉式,一个为饿汉式。

a.懒汉式的实现逻辑为:

在声明对象实例的时候不着急,会一直等到马上要使用对象实例的时候才会创建。懒人,总是在迫不得已的时候才会去做这件事情,在装载对象的时候不会马上创建对象实例。

class LazySingleton
{
//4.定义唯一实例的成员变量
//5.由于该实例需要在Static方法中使用,将其定义为static
private static LazySingleton _lazySingleton; //1.将构造函数私有化,以防外面示例化该对象
private LazySingleton()
{
} //2.对外公开一个全局访问点(public)
//3.由于外面不能通过new LazySingleton()来调用该方法(这样就违背单例原则),因此将该方法定义为static
public static LazySingleton GetSingleton()
{
//6.为防止同时两个用户同时调用,里面使用锁机制。在锁里面第一句话也要判断_lazySingleton是否为空
if (_lazySingleton != null)
return _lazySingleton;
lock(typeof(LazySingleton))
{
if (_lazySingleton != null)
return _lazySingleton;
_lazySingleton = new LazySingleton();
return _lazySingleton;
}
}
}

b.饿汉式的实现逻辑为:

class HungrySingleton
{
//4.定义staitc形式的唯一实例的成员变量,并且实例化
private static HungrySingleton _hungrySingleton = new HungrySingleton(); //1.将构造函数私有化,以防外面示例化该对象
private HungrySingleton()
{
} //2.对外公开一个全局访问点(public)
//3.由于外面不能通过new LazySingleton()来调用该方法(这样就违背单例原则),因此将该方法定义为static
public static HungrySingleton GetSingleton()
{
//5.直接返回static形式的已经实例化好的成员变量
return _hungrySingleton;
}
}

c.饿汉式和懒汉式的区别为(后续补充顺序示意图)

懒汉式单例模式,体现了延迟加载的思想,即一开始不加载资源或者数据,一直等,等到马上就要使用这个资源或者数据了,躲不过去了才加载,也称为Lazy Load.懒汉式是典型的以时间换空间。

饿汉式在类加载的时候就会创建类实例,不管你用不用,先创建出来,然后每次调用的时候就不用再判断了,节省了允许时间。

饿汉式是典型的以空间换时间。

最新文章

  1. HDFS的联盟Federation
  2. jQuery全选与反选,且解决点击只执行一次的问题
  3. class-dump 复制到/usr/bin目录不可写,Operation not permitted 解决办法
  4. ASP.NET中的特殊路径标识"~"
  5. 第六百二十一天 how can I 坚持
  6. KVO等具体实现步骤以及注意事项
  7. layer —— 一个简单的jQuery弹出层插件
  8. while循环--登录
  9. IO流的分类
  10. javascript获取DOM对象三种方法
  11. JavaScript:今天是今年第几周?
  12. 使用代数方程库 Algebra.js解二元一次方程
  13. VBA 使用QueryTables 中文乱码的处理
  14. SQLSERVER中KeyHashValue的作用(下)
  15. node websocket学习研究
  16. 解决命令行运行python文件,出现No module named *** 报错问题
  17. mac苹果ping不通网络
  18. 论文研读之Spinnaker
  19. EXE模块说明
  20. Django Managers管理器

热门文章

  1. http://www.imooc.com/video/4767 zepto教学视频笔记
  2. python数据分析师面试题选
  3. Flask + Gunicorn + Nginx 部署
  4. cocso2d-x改变精灵图片
  5. [ZOJ 3662] Math Magic (动态规划+状态压缩)
  6. Grunt 之通配符
  7. PL/0与Pascal-S编译器程序详细注释
  8. Android开发-API指南-<uses-configuration>
  9. SDUT 3344 数据结构实验之二叉树五:层序遍历
  10. 设计模式——适配器模式(Adapter Pattern)