模式说明:

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

应用场景:

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.懒汉式是典型的以时间换空间。

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

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

设计模式-单例模式(Singleton)的更多相关文章

  1. 设计模式 单例模式(Singleton) [ 转载2 ]

    设计模式 单例模式(Singleton) [ 转载2 ] @author java_my_life 单例模式的结构 单例模式的特点: 单例类只能有一个实例. 单例类必须自己创建自己的唯一实例. 单例类 ...

  2. 设计模式 单例模式(Singleton) [ 转载 ]

    设计模式 单例模式(Singleton) [ 转载 ] 转载请注明出处:http://cantellow.iteye.com/blog/838473 前言 懒汉:调用时才创建对象 饿汉:类初始化时就创 ...

  3. JAVA设计模式-单例模式(Singleton)线程安全与效率

    一,前言 单例模式详细大家都已经非常熟悉了,在文章单例模式的八种写法比较中,对单例模式的概念以及使用场景都做了很不错的说明.请在阅读本文之前,阅读一下这篇文章,因为本文就是按照这篇文章中的八种单例模式 ...

  4. 浅谈设计模式--单例模式(Singleton Pattern)

    题外话:好久没写blog,做知识归纳整理了.本来设计模式就是个坑,各种文章也写烂了.不过,不是自己写的东西,缺少点知识的存在感.目前还没做到光看即能记住,得写.所以准备跳入设计模式这个大坑. 开篇先贡 ...

  5. [工作中的设计模式]单例模式singleton

    一.模式解析: 单例模式是最简单和最常用的设计模式,面试的时候,不管新毕业的学生还是已经工作多年的筒子,对单例模式基本都能聊上两句.单例模式主要体现在如下方面: 1.类的构造函数私有化,保证外部不能直 ...

  6. 23种设计模式--单例模式-Singleton

    一.单例模式的介绍 单例模式简单说就是掌握系统的至高点,在程序中只实例化一次,这样就是单例模式,在系统比如说你是该系统的登录的第多少人,还有数据库的连接池等地方会使用,单例模式是最简单,最常用的模式之 ...

  7. 设计模式--单例模式Singleton(创建型)

    单例模式很显然是定义一个类,这个类在程序中只有唯一的实例对象.一般单例类的构造函数是私有的,只能通过调用静态函数GetInstance来获取实例. 一.单例模式有三种:懒汉式单例.饿汉式单例.登记式单 ...

  8. 设计模式--单例模式Singleton

    单例模式顾名思义整个程序下只有一个实例,例如一个国家只有一个皇帝,一个军队只有一个将军.单例模式的书写又分为饿汉模式和懒汉模式 饿汉模式   类中代码 package demo; public cla ...

  9. 设计模式——单例模式(Singleton)

    保证一个类仅有一个实例,并提供一个访问它的全局访问点.——DP UML类图 模式说明 个人认为单例模式是所有设计模式中最为简单的一个模式,因为实现这个模式仅需一个类,而不像其他模式需要若干个类.这个模 ...

  10. 设计模式-单例模式(Singleton) (创建型模式)

    //以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码 //Singleton.h #pragma once #include<iostream> class Sin ...

随机推荐

  1. django不要设置datetime字段auto_now=True

    django model的datetime字段如果设置了auto_now=True的话,update该记录的时候即使没有更新它的时间字段,它的时间字段依然会执行一遍auto_now,时间会变成当前更新 ...

  2. nyoj 88 汉诺塔(一)

    点击打开链接 汉诺塔(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝 ...

  3. HTML控件-Select

    从今天开始,编写对于html控件的特性的探索文章,会广泛的引用网络的资源,所以本文的版权属于广大人民群众,欢迎转载,也同样禁止商业应用. [高手勿喷,标签页点击红色叉叉] select控件有一个特性: ...

  4. access的查询中具体到时间的时候使用“#”

    如果不使用#的情况下会导致出现操作符丢失的错误提示,因此再比较时间的时候将日期和时间用#包括起来: 例如: SELECT *FROM ms_record where dateTo > #2015 ...

  5. cocos2d 3.0自定义事件答疑解惑

    疑惑一:在事件分发中修改订阅者 ,对于这个的理解. 事件的分发是可以嵌套的,cocos2dx使用_inDispatch来保存当前嵌套的深度,当调用第一个dispatchEvent的时候,_inDisp ...

  6. android 数据存储----文件方式 总结

    在android中的文件放在不同位置,它们的读取方式也有一些不同. 本文对android中对资源文件的读取.数据区文件的读取.SD卡文件的读取及RandomAccessFile的方式和方法进行了整理. ...

  7. JavaScript内置对象

    对象概述 JavaScript是一种基于对象的脚本语句,而不是面向对象的编程语言.对象就是客观世界存在的实体,具有属性和方法两方面特性. 访问对象的属性和方法的方式如下: 对象名.属性 对象名.方法名 ...

  8. 转载收藏- (TTL与CMOS)电路常识性概念

    原帖:http://blog.sina.com.cn/s/blog_48c0c0190101bbth.html

  9. JDK源码分析之集合03LinkedList

    一.前言 LinkedList是双向列表,实现方式是使用链表的方式保存元素:除了第一个和最后一个元素外,每一个节点都包含一个指向前一个和指向后一个节点的指针和元素的值.其特点是插入删除效率高,而随机访 ...

  10. 【程序与资源】linux程序与资源管理

    程序与资源管理:ps.top.free.sar.kill.uname ①ps语法: [root @test /root ]# ps -aux 参数说明: a   :选择所有的程序列出 u   :所有使 ...