一: 饿汉式单例:

静态区初始化instance,然后通过getInstance返回。这种方式没有多线程的问题,是一种以空间换时间的方式,不管程序用不用,都会构造唯一的实例。

#pragma once

#include <Windows.h>
#include "Lock.h"

class Singleton
{
private:
Singleton(); // 构造函数只能在这个类内部自己能用,创建唯一实例
Singleton(const Singleton&); // 防止被复制
Singleton& operator=(const Singleton&); //防止赋值
~Singleton();
static Singleton* m_pInstance;
public:
static Singleton* getInstance()
{
return m_pInstance;
}
};

#include "stdafx.h"
#include "Singleton.h"

Singleton::Singleton()
{
}

Singleton::~Singleton()
{
}

Singleton::Singleton(const Singleton&)
{}
Singleton& Singleton::operator=(const Singleton&)
{
return *this;
}

Singleton* Singleton::m_pInstance = new Singleton();

// DesignPattern.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "Singleton.h"

#include <iostream>

using namespace std;

int main()
{
Singleton *aaa = Singleton::getInstance();
Singleton *bbb = Singleton::getInstance();

cout <<(int*)aaa << endl;
cout <<(int*) bbb << endl;
}

二: 懒汉式单例:

在需要的时候才创建唯一的实例,可能有多线程的问题。下面是采用双重检查的方式实现:

2.1 用类的静态成员的方式

#include <Windows.h>

#include "Lock.h"

class Singleton
{
private:
Singleton(); // 构造函数只能在这个类内部自己能用,创建唯一实例
Singleton(const Singleton&); // 防止被复制
Singleton& operator=(const Singleton&); // 防止赋值
~Singleton();
static Singleton* m_pInstance;
public:
static Singleton* getInstance()
{
if (m_pInstance == NULL)
{
lock(); // 使用其他的方式实现,这里只是意思一下
if (m_pInstance == NULL)
{
m_pInstance = new Singleton();
}
unlock();
}

return m_pInstance;
}
};

#include "stdafx.h"
#include "Singleton.h"

Singleton::Singleton()
{
}

Singleton::~Singleton()
{
}

Singleton::Singleton(const Singleton&)
{}
Singleton& Singleton::operator=(const Singleton&)
{
return *this;
}

Singleton* Singleton::m_pInstance =NULL;

// DesignPattern.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "Singleton.h"

#include <iostream>

using namespace std;

int main()
{
Singleton *aaa = Singleton::getInstance();
Singleton *bbb = Singleton::getInstance();

cout <<(int*)aaa << endl;
cout <<(int*) bbb << endl;
}

2.1 用局部静态变量的方式

#pragma once

#include <Windows.h>

#include "Lock.h"

class Singleton
{
private:
Singleton(); // 构造函数只能在这个类内部自己能用,创建唯一实例
Singleton(const Singleton&); // 防止被复制
Singleton& operator=(const Singleton&); // 防止赋值
~Singleton();
public:
static Singleton* getInstance()
{
static Singleton singleton;
// C++0X 以后,局部静态变量可以保证线程安全的;但是C++0X之前,仍然要加锁

return &singleton;
}
};

#include "stdafx.h"
#include "Singleton.h"

Singleton::Singleton()
{
}

Singleton::~Singleton()
{
}

Singleton::Singleton(const Singleton&)
{}
Singleton& Singleton::operator=(const Singleton&)
{
return *this;
}

// DesignPattern.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "Singleton.h"

#include <iostream>

using namespace std;

int main()
{
Singleton *aaa = Singleton::getInstance();
Singleton *bbb = Singleton::getInstance();

cout <<(int*)aaa << endl;
cout <<(int*) bbb << endl;
}

设计模式——单例模式(C++)的更多相关文章

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

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

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

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

  3. c#设计模式-单例模式(面试题)

    c#设计模式-单例模式 单例模式三种写法: 第一种最简单,但没有考虑线程安全,在多线程时可能会出问题, public class Singleton { private static Singleto ...

  4. java设计模式单例模式 ----懒汉式与饿汉式的区别

    常用的五种单例模式实现方式 ——主要: 1.饿汉式(线程安全,调用率高,但是,不能延迟加载.) 2.懒汉式(线程安全,调用效率不高,可以延时加载.) ——其他: 1.双重检测锁式(由于JVM底层内部模 ...

  5. 最简单的设计模式——单例模式的演进和推荐写法(Java 版)

    前言 如下是之前总结的 C++ 版的:软件开发常用设计模式—单例模式总结(c++版),对比发现 Java 实现的单例模式和 C++ 的在线程安全上还是有些区别的. 概念不多说,没意思,我自己总结就是: ...

  6. ES6教程-字符串,函数的参数,了解函数的arguments对象,js面向对象,设计模式-单例模式,解构赋值

    前言 主要讲解了ES6对字符串的拓展,包括includes,startsWith和endsWith,另外增加了字符串模板. Start includes()是否包含 startsWith()以什么开头 ...

  7. Java设计模式の单例模式

    -------------------------------------------------- 目录 1.定义 2.常见的集中单例实现 a.饿汉式,线程安全 但效率比较低 b.单例模式的实现:饱 ...

  8. java设计模式——单例模式(一)

    一. 定义与类型 定义:保证一个类仅有一个实例,并提供一个全局访问点 类型:创建型 二. 适用场景 想确保任何情况下都绝对只用一个实例 三. 优缺点 优点: 在内存里只有一个实例,减少了内存开销 可以 ...

  9. php实现设计模式————单例模式

    php实现设计模式————单例模式 什么是单例模式 为什么要使用单例模式 php中有哪些方式实现新建一个对象实例 如何阻止这种实例化实现理想的单例模式 代码实现 什么是单例模式 为什么要使用单例模式 ...

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

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

随机推荐

  1. Linux虚拟机基本操作

    ---恢复内容开始---  一.输入法调整 实现步骤:Application ------> System Tools ------>Settings ------>Rejion&a ...

  2. 【Spring实战】Spring容器初始化完成后执行初始化数据方法

    一.背景知识及需求 在做WEB项目时,经常在项目第一次启动时利用WEB容器的监听.Servlet加载初始化等切入点为数据库准备数据,这些初始化数据是系统开始运行前必须的数据,例如权限组.系统选项.默认 ...

  3. JMter请求参数中文显示乱码

    如上图所示,上传的参数为中文的时候,显示不出来,解决方法如下: 1.进入Jmter安装文件bin文件夹,找到文件jmeter.properties 2.在该文件找到jsyntaxtextarea.fo ...

  4. vue 之node.js 02

    文档 铺垫 以前网页制作web1.0 如今是web2.0-->交互式操作 前端工具 grunt gulp webpack :打包机 作用:将项目中的js,css,img,font,html等进行 ...

  5. js之3D轮播图

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. 【剑指offer-25】合并两个单调递增的链表,C++实现(链表)

    原创博客,转载请注明出处! 1.题目 输入两个单调递增的链表,输出两个链表合成后的链表(单调不减). 2.思路(递归) # 鲁棒性: 如果链表1是空链表,则直接输出链表2. 如果链表2是空链表,则直接 ...

  7. Jmeter简单的操作数据库

    mysql驱动包下载地址: https://dev.mysql.com/downloads/connector/j/ 1.添加驱动配置,把下载下来的驱动配置上去 2.添加‘配置元件-用户定义的变量’, ...

  8. BZOJ1857 Scoi2010 传送带 【三分】

    BZOJ1857 Scoi2010 传送带 Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P ...

  9. Oracle中用exp/imp命令快速导入导出数据

    from: http://blog.csdn.net/wangchunyu11155/article/details/53635602 [用 exp 数 据 导 出]: 1 将数据库TEST完全导出, ...

  10. SQL Server 为存储过程添加预定设置注释代码

    一个优秀的项目最少不了的是代码注释,兴许你是代码高手入目既知道该段代码主要功能是什么,但日子长了,记的东西多了,即时再熟悉的代码也渐渐的有点不认 识它,所以养成良好的写注释的习惯,对于自己对于他人都是 ...