1.意图

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

2.动机

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

3.适用性

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

4.结构

5.代码实例

#include <iostream>
#include <Windows.h> //静态成员实例的懒汉模式 class Singleton
{
public:
static CRITICAL_SECTION gSection;
static Singleton * GetInstance()
{
InitializeCriticalSection(&gSection);
EnterCriticalSection(&gSection);
if(NULL == m_pSingleton)
{
m_pSingleton = new Singleton();
}
return m_pSingleton;
LeaveCriticalSection(&gSection);
} void Print()
{
std::cout<<"Singleton is Created"<<std::endl;
} private:
static Singleton* m_pSingleton;
Singleton()
{
} };
CRITICAL_SECTION Singleton::gSection; Singleton* Singleton::m_pSingleton = NULL;

静态成员实例的懒汉模式

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

class SingletonInside
{
public:
static CRITICAL_SECTION CriticalSection;
static SingletonInside * GetInstance()
{
InitializeCriticalSection(&CriticalSection);
EnterCriticalSection(&CriticalSection);
static SingletonInside instace;
return &instace;
LeaveCriticalSection(&CriticalSection); } void Print()
{
std::cout<<"SingletonInside is Created"<<std::endl;
} private:
SingletonInside()
{
}
};
CRITICAL_SECTION SingletonInside::CriticalSection;

内部静态变量型饿汉模式

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

class SingletonStatic
{
public:
static const SingletonStatic * GetInstance()
{
return m_SingletonInstance;
} void Print()
{
std::cout<<"SingletonStatic is Created"<<std::endl;
} private:
static const SingletonStatic * m_SingletonInstance;
SingletonStatic()
{
} }; const SingletonStatic* SingletonStatic::m_SingletonInstance = new SingletonStatic();

饿汉模式

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

#include "Singleton.h"

int main()
{
auto pSingltonInstacne = Singleton::GetInstance();
pSingltonInstacne->Print(); auto pSingltonInside = SingletonInside::GetInstance();
pSingltonInside->Print(); auto pSingltonStatic = SingletonStatic::GetInstance();
pSingltonStatic->Print(); while(); }

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. 生成new, old的 shell script

    #!/bin/bash #usage: ./create_dts_diff_v2.x.sh path1 path2 __new_dir=$1 __old_dir=$2 #=============== ...

  2. SQL总结(三)其他查询

    SQL总结(三)其他查询 其他常用的SQL,在这里集合. 1.SELECT INTO 从一个表中选取数据,然后把数据插入另一个表中.常用于创建表的备份或者用于对记录进行存档. 语法: SELECT c ...

  3. 函数调用方式__stdcall、__cdel

    函数调用方式关系对比如下: 关键字 调用规则 参数传递方向 返回 参数寄存器 堆栈的清除 __cdecl C语言 从右向左 EAX 无 调用者 __stdcall Win32标准  从右向左 EAX ...

  4. phonegap(cordova)环境配置

    首先要配置好  java jdk 和 java jre 环境 配置之后 控制台  javac -version 查看是否配置成功 然后配置 Android sdk 配置之后 控制台 输入 adb 查看 ...

  5. 【javascript基础】6、new与构造函数

    前言 上篇说创建对象的时候提到了带返回值的构造函数,那里没有和大家说这个问题,今天就和大家一起学习构造函数和new操作符.我也是最近才稍微弄明白点这个构造函数,以前总是忽略一些问题,现在就是想到哪块不 ...

  6. 相机标定:关于用Levenberg-Marquardt算法在相机标定中应用

    LM算法在相机标定的应用共有三处. (1)单目标定或双目标定中,在内参固定的情况下,计算最佳外参.OpenCV中对应的函数为findExtrinsicCameraParams2. (2)单目标定中,在 ...

  7. (LinkedList) Remove Linked List Elements

    Remove all elements from a linked list of integers that have value val. ExampleGiven: 1 --> 2 --& ...

  8. UNIX网络编程-基本API介绍(一)

    1.基本结构 大多数套接口函数都需要一个指向套接口地址结构的指针作为参数.每个协议族都定义它自己的套接口地址结构.这些结构的名字均以“sockaddr_”开头,并以对应每个协议族的唯一后缀结束. 1. ...

  9. shutdown immediate时 hang住 (转载)

    shutdown immediate 经常关库时hang住,在alert中有 License high water mark = 4All dispatchers and shared servers ...

  10. 八、MPxToolCommand, tool command

    1. Tool Property Sheets: 是用来更改context属性的编辑框,类似于attribute editor.(property和attribute本质上是一个意思)作用于activ ...