1.意图

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

2.动机

对一些类来说,只有一个实例是很重要的。让类自身负责保存它唯一的实例,这个类可以保证没有其他实例可以被创建(通过截取创建新对象的请求),并且它可以提供一个访问该实例的方法。

3.适用性

  • 当类只能有一个实例而且客户可以从一个周所周知的访问点访问它时。
  • 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。

4.结构

5.代码实例

  1. #include <iostream>
  2. #include <Windows.h>
  3.  
  4. //静态成员实例的懒汉模式
  5.  
  6. class Singleton
  7. {
  8. public:
  9. static CRITICAL_SECTION gSection;
  10. static Singleton * GetInstance()
  11. {
  12. InitializeCriticalSection(&gSection);
  13. EnterCriticalSection(&gSection);
  14. if(NULL == m_pSingleton)
  15. {
  16. m_pSingleton = new Singleton();
  17. }
  18. return m_pSingleton;
  19. LeaveCriticalSection(&gSection);
  20. }
  21.  
  22. void Print()
  23. {
  24. std::cout<<"Singleton is Created"<<std::endl;
  25. }
  26.  
  27. private:
  28. static Singleton* m_pSingleton;
  29. Singleton()
  30. {
  31. }
  32.  
  33. };
  34. CRITICAL_SECTION Singleton::gSection;
  35.  
  36. Singleton* Singleton::m_pSingleton = NULL;

静态成员实例的懒汉模式

注意此实例的构造函数为私有的以防止使用时实例化此类。此实例加了临界区(也可加锁)以保证单例的线程安全,频繁加锁可能会有性能问题(处理大量数据时)。

  1. class SingletonInside
  2. {
  3. public:
  4. static CRITICAL_SECTION CriticalSection;
  5. static SingletonInside * GetInstance()
  6. {
  7. InitializeCriticalSection(&CriticalSection);
  8. EnterCriticalSection(&CriticalSection);
  9. static SingletonInside instace;
  10. return &instace;
  11. LeaveCriticalSection(&CriticalSection);
  12.  
  13. }
  14.  
  15. void Print()
  16. {
  17. std::cout<<"SingletonInside is Created"<<std::endl;
  18. }
  19.  
  20. private:
  21. SingletonInside()
  22. {
  23. }
  24. };
  25. CRITICAL_SECTION SingletonInside::CriticalSection;

内部静态变量型饿汉模式

此内部静态变量只会初始化一次,因此每次获取实例时,获取的为同一个实例。

  1. class SingletonStatic
  2. {
  3. public:
  4. static const SingletonStatic * GetInstance()
  5. {
  6. return m_SingletonInstance;
  7. }
  8.  
  9. void Print()
  10. {
  11. std::cout<<"SingletonStatic is Created"<<std::endl;
  12. }
  13.  
  14. private:
  15. static const SingletonStatic * m_SingletonInstance;
  16. SingletonStatic()
  17. {
  18. }
  19.  
  20. };
  21.  
  22. const SingletonStatic* SingletonStatic::m_SingletonInstance = new SingletonStatic();

饿汉模式

静态成员初始化在进入main函数之前已经完成,此种实现没有争夺锁的性能问题。

  1. #include "Singleton.h"
  2.  
  3. int main()
  4. {
  5. auto pSingltonInstacne = Singleton::GetInstance();
  6. pSingltonInstacne->Print();
  7.  
  8. auto pSingltonInside = SingletonInside::GetInstance();
  9. pSingltonInside->Print();
  10.  
  11. auto pSingltonStatic = SingletonStatic::GetInstance();
  12. pSingltonStatic->Print();
  13.  
  14. while();
  15.  
  16. }

Test.cpp

6.测试结果

7.效果

  • 对唯一实例的受控访问
  • 缩小名空间
  • 允许对操作和表示的精化
  • 允许可变数目的实例
  • 比类操作更灵活

singleton(单件)-对象创建型模式的更多相关文章

  1. 设计模式01: Singleton 单例模式(创建型模式)

    Singleton 单例模式(创建型模式) 动机(Motivation)当进行软件开发是会有这样一种需求:在系统中只有存在一个实例才能确保它们的逻辑正确性.以及良好的效率.这应该是类设计者的责任,而不 ...

  2. 设计模式(3)-对象创建型模式-Abstract Factory模式

    1.对象创建型模式 1.3           Abstract Factory模式 1.3.1 需求 在下面情况能够使用Abstract Factory模式: •  一个系统要独立于它的产品的创建. ...

  3. 设计模式(4)-对象创建型模式-Prototype模式

    1.对象创建型模式 1.4          Protoype模式 1.4.1需求 通过拷贝原形对象创建新的对象. 1.4.2结构 •P r o t o t y p e(Gr a p h i c) - ...

  4. Singleton模式——对象创建型模式

    Singleton模式即为单例模式/单件模式. (一)意图--保证一个类仅有一个实例,并提供一个访问它的全局访问点. 如一台计算机可以有多个端口,但是应该统一管理这些端口,避免访问冲突.--选择Sin ...

  5. 对象创建型模式------Singleton(单例模式)

    地址:http://blog.csdn.net/wuzhekai1985/article/details/6665869.仅供自己参考学习. 单例模式:保证一个类仅有一个实例,并提供一个访问它的全局节 ...

  6. 设计模式可复用面向对象软件设计基础之对象创建型模式—ABSTRACT FACTORY( 抽象工厂)

    意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 适用性 在以下情况可以使用 Abstract Factory模式 • 一个系统要独立于它的产品的创建.组合和表示时. • 一 ...

  7. ProtoType(原型)-对象创建型模式

    1.意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 2.动机 通过拷贝或者“克隆”一个类的实例来创建新的实例. 3.适用性 当一个系统应该独立于它的产品创建.构成和表示时,要使 ...

  8. Builder(生成器)-对象创建型模式

    一.意图 将一个复杂对象的构建与它的表示分离,使得同样的构造过程可以创建不同的表示. 二.动机 一个复杂的对象的构造过程中,原料相同,可能会要求生产不同的产品,并且生产的产品种类还能够方便的增加.Bu ...

  9. 对象创建型模式------Builder(生成器)

    本文系转载,转载地址http://blog.sina.com.cn/s/blog_59b6af690100zj3l.html,只供自己学习使用. 假设现在有三种产品,是玩具,都是由三部分组成,头,身体 ...

随机推荐

  1. 关于 MaxScript 获取所有贴图

    相关内容记录在官方文档 BitmapTexture : TextureMap 中 fn allUsedMaps = ( sceneMaps = usedMaps() for m in meditmat ...

  2. Following a Select Statement Through Postgres Internals

    This is the third of a series of posts based on a presentation I did at the Barcelona Ruby Conferenc ...

  3. javascript中的事件委托

    这几天看到一个面试题,大概就是,让你给1000个li都添加一个click事件,应该怎么添加?大多数人第一开始的感觉可能就是,每个li上边都添加一个呗,那要是这样的话,估计面试的时候就会GG了,这里就是 ...

  4. javascript性能优化总结二(转载)

    上面一篇文章大致介绍了一些javascript当中使用的一些小技巧,当下这篇文章继续介绍一下内存管理.松散耦合.性能方面的一些小知识.为避免错误应该注意的点 内存管理 1.循环引用 如果循环引用中包含 ...

  5. R中,定义一个长度为0的向量

    定义一个长度为0的向量 > x<-c()> length(x)[1] 0 修改该向量的类型 > class(x)="numeric"> class(x ...

  6. ADF_Data Binding系列1_使用Bean Data Control

    2015-02-16 Created By BaoXinjian

  7. C 和指针 学习随便

    ---恢复内容开始--- 对NULL的解引用访问,有可能报错,有可能不会,取决于编译器 指针数组以一个NULL指针结束 ######################################## ...

  8. mysql <-> sqlite

    在做程序时,sqlite数据很方便.用mysql数据导出到sqlite的步骤:(用csv文件过渡) -------------------------------  先导出到csv文件  ------ ...

  9. Codeforces 719E [斐波那契区间操作][矩阵快速幂][线段树区间更新]

    /* 题意:给定一个长度为n的序列a. 两种操作: 1.给定区间l r 加上某个数x. 2.查询区间l r sigma(fib(ai)) fib代表斐波那契数列. 思路: 1.矩阵操作,由矩阵快速幂求 ...

  10. Python基础篇【第2篇】: Python内置函数(一)

    Python内置函数 lambda lambda表达式相当于函数体为单个return语句的普通函数的匿名函数.请注意,lambda语法并没有使用return关键字.开发者可以在任何可以使用函数引用的位 ...