设计模式——单例模式(C++)
一: 饿汉式单例:
静态区初始化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++)的更多相关文章
- 设计模式 单例模式(Singleton) [ 转载2 ]
设计模式 单例模式(Singleton) [ 转载2 ] @author java_my_life 单例模式的结构 单例模式的特点: 单例类只能有一个实例. 单例类必须自己创建自己的唯一实例. 单例类 ...
- 设计模式 单例模式(Singleton) [ 转载 ]
设计模式 单例模式(Singleton) [ 转载 ] 转载请注明出处:http://cantellow.iteye.com/blog/838473 前言 懒汉:调用时才创建对象 饿汉:类初始化时就创 ...
- c#设计模式-单例模式(面试题)
c#设计模式-单例模式 单例模式三种写法: 第一种最简单,但没有考虑线程安全,在多线程时可能会出问题, public class Singleton { private static Singleto ...
- java设计模式单例模式 ----懒汉式与饿汉式的区别
常用的五种单例模式实现方式 ——主要: 1.饿汉式(线程安全,调用率高,但是,不能延迟加载.) 2.懒汉式(线程安全,调用效率不高,可以延时加载.) ——其他: 1.双重检测锁式(由于JVM底层内部模 ...
- 最简单的设计模式——单例模式的演进和推荐写法(Java 版)
前言 如下是之前总结的 C++ 版的:软件开发常用设计模式—单例模式总结(c++版),对比发现 Java 实现的单例模式和 C++ 的在线程安全上还是有些区别的. 概念不多说,没意思,我自己总结就是: ...
- ES6教程-字符串,函数的参数,了解函数的arguments对象,js面向对象,设计模式-单例模式,解构赋值
前言 主要讲解了ES6对字符串的拓展,包括includes,startsWith和endsWith,另外增加了字符串模板. Start includes()是否包含 startsWith()以什么开头 ...
- Java设计模式の单例模式
-------------------------------------------------- 目录 1.定义 2.常见的集中单例实现 a.饿汉式,线程安全 但效率比较低 b.单例模式的实现:饱 ...
- java设计模式——单例模式(一)
一. 定义与类型 定义:保证一个类仅有一个实例,并提供一个全局访问点 类型:创建型 二. 适用场景 想确保任何情况下都绝对只用一个实例 三. 优缺点 优点: 在内存里只有一个实例,减少了内存开销 可以 ...
- php实现设计模式————单例模式
php实现设计模式————单例模式 什么是单例模式 为什么要使用单例模式 php中有哪些方式实现新建一个对象实例 如何阻止这种实例化实现理想的单例模式 代码实现 什么是单例模式 为什么要使用单例模式 ...
- JAVA设计模式-单例模式(Singleton)线程安全与效率
一,前言 单例模式详细大家都已经非常熟悉了,在文章单例模式的八种写法比较中,对单例模式的概念以及使用场景都做了很不错的说明.请在阅读本文之前,阅读一下这篇文章,因为本文就是按照这篇文章中的八种单例模式 ...
随机推荐
- Java基础学习-常见API
package commonAPIs; /*java.lang 类 Object java.lang.Object public class Object类 Object 是类层次结构的根类.每个类都 ...
- L171
As much as we thirst for approval, we dread condemnation.我们渴望赞许,同样也害怕受到指责.If somebody's father was o ...
- jsp笔记总结
第一章 JavaWeb简介 1.什么是Web应用程序 什么是Web应用程序是一种通过Web访问的应用程序.Web应用程序一个最大优点就是用户很容易访问.用户只需要有浏览器即可,不需要再安装其他软件.W ...
- EasyDSS RTMP流媒体服务器videojs flash播放RTMP/HLS提示错误的解决方案
本文转自EasyDSS团队成员StarIT的博客:http://blog.csdn.net/staritstarit/article/details/73692715 问题 在博客<EasyDS ...
- 文件处理工具 gif合成工具 文件后缀批量添加工具 文件夹搜索工具 重复文件查找工具 网页图片解析下载工具等
以下都是一些简单的免费分享的工具,技术支持群:592132877,提供定制化服务开发. Gif动图合成工具 主要功能是扫描指定的文件夹里的所有zip文件,然后提取Zip文件中的图片,并合成一张gif图 ...
- [interview]螺旋队列问题
摘要 本文主要讲解三种螺旋队列的实现方式和打印输出: 从中心往外端顺时针旋转,记为『外螺旋队列』 从左顶点开始,绕剩下的最大圈顺时针往内旋转,记为『内螺旋队列』 从左顶点开始,之字形旋转(只能同行同列 ...
- centos7 安装php 5.x.x 报错
错误1: /usr/src/php-5.2.9/ext/dom/node.c:In function 'dom_canonicalization': /usr/src/php-5.2.9/ext/do ...
- Struts标签库详解,非常好的Struts标签详解
Struts提供了五个标签库,即:HTML.Bean.Logic.Template和Nested. HTML 标签: 用来创建能够和Struts 框架和其他相应的HTML 标签交互的H ...
- 《DSP using MATLAB》示例Example 8.4
代码: %% ------------------------------------------------------------------------ %% Output Info about ...
- asciidoctor 安装试用
备注: asciidoctor 是asciidoc 的增强,使用简单,模板比较丰富,对于持续集成方面的开发也是一个不错的工具 1. 安装 a. 环境准备 MRI Ruby 1.8.7, 1. ...