C++实现单例模式
昨天面试的时候,面试官让我用C++或Java实现一个单例模式。
因为设计模式是在12年的时候学习过这门课,而且当时觉得这门课很有意思,所以就把课本读了几遍,所以印象比较深刻,但是因为实际编程中很少注意使用,所以没能编码实现。
这是之前用C#写的一个单例模式的文章:http://www.cnblogs.com/CheeseZH/archive/2012/05/14/2500546.html
什么是单例模式
单件模式(SingletonPattern):确保一个类只有一个实例,并提供一个全局访问点。和全局变量一样方便,又没有全局变量的缺点,即不需要从一开始就创建对象,而是在需要时才创建它。
那么要如何保证一个类只能被实例化一次呢?一般情况下,如果存在一个类,我们都是可以多次地实例化它的。那么如果这样呢:
public MyClass{
private MyClass(){
}
}
咦?构造函数私有?含有私有的构造器的类应该是不能被其他类实例化的,因为只有MyClass内部的代码才能调用这个私有的构造函数。虽然只有MyClass类的实例才能调用MyClass构造器,但在这之前,必须有一个MyClass实例。然而这个类又不能被实例化,这样就产生了矛盾!
看下面这段代码:
public MyClass{
public static MyClass getInstance(){
}
}
上面的代码表示MyClass有一个静态方法,我们可以这样调用这个方法:MyClass.getInstance(); 因为getInstance()是一个静态方法,换句话说,是一个“类”方法。引用一个静态方法,你需要使用类名,而不是对象名。
那么把上面两段代码合在一起,是否就可以使MyClass只产生一个实例了呢?
看下面的代码:
public class MyClass{
//利用一个静态变量来记录MyClass类的唯一实例
private static MyClass uniqueInstance;
//私有构造函数,只有自MyClass类内才可以调用
private MyClass() {}
//用getInstance静态方法实例化对象,并返回
public static MyClass getInstance(){
if(uniqueInstance == NULL)
{
uniqueInstance = new MyClass();
}
return uniqueInstance;
}
//当然,单件类也是一个正常的类,具有其他的变量和方法
//...
}
这就是一个经典的单件模式的实现!之所以实例唯一,是因为单件类没有公开的构造器,其他类不能自行将其实例化得到一个实例,而必须通过它的静态方法getInstance()去创建一个实例。

C++完整实现
Singleton.h
#pragma once
class Singleton{
private:
Singleton();
~Singleton();
static Singleton* uniqueInstance;
public:
static Singleton* getInstance();
// other methods...
};
Singleton.cpp
#include"Singleton.h"
#include<iostream>
using namespace std; Singleton::Singleton(){ } Singleton::~Singleton(){
if(uniqueInstance == NULL){
return;
}
delete uniqueInstance;
uniqueInstance = ;
} Singleton* Singleton::getInstance(){
if(uniqueInstance == NULL){
uniqueInstance = new Singleton;
}
return uniqueInstance;
}
main.cpp
#include<iostream>
#include"Singleton.h"
using namespace std; Singleton* Singleton::uniqueInstance = NULL; int main(){
Singleton* singleton1 = Singleton::getInstance();
Singleton* singleton2 = Singleton::getInstance();
if(singleton1 == singleton2){
cout<<"Got same singleton!!"<<endl;
}
else{
cout<<"Oh,no!got a different singleton!!"<<endl;
}
return ;
}
一个完整的单例模式代码:
#include<iostream>
using namespace std;
class CSingleton
{
private:
CSingleton() {
}
~CSingleton() {
if (m_pInstance == NULL) {
return;
}
delete m_pInstance;
m_pInstance = NULL;
}
static CSingleton *m_pInstance;
public:
static CSingleton * GetInstance() {
if(m_pInstance == NULL)
m_pInstance = new CSingleton();
return m_pInstance;
}
};
CSingleton* CSingleton::m_pInstance = NULL;//类的静态成员变量需要在类外边初始化 int main() { CSingleton* single1 = CSingleton::GetInstance();
CSingleton* single2 = CSingleton::GetInstance(); if (single1 == single2) {
cout<<"Same"<<endl;
}
return ;
}
C++实现单例模式的更多相关文章
- C++实现线程安全的单例模式
在某些应用环境下面,一个类只允许有一个实例,这就是著名的单例模式.单例模式分为懒汉模式,跟饿汉模式两种. 首先给出饿汉模式的实现 template <class T> class sing ...
- 23种设计模式--单例模式-Singleton
一.单例模式的介绍 单例模式简单说就是掌握系统的至高点,在程序中只实例化一次,这样就是单例模式,在系统比如说你是该系统的登录的第多少人,还有数据库的连接池等地方会使用,单例模式是最简单,最常用的模式之 ...
- angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用
今天我们要讲的是ng2的路由系统. 例子
- java设计模式之--单例模式
前言:最近看完<java多线程编程核心技术>一书后,对第六章的单例模式和多线程这章颇有兴趣,我知道我看完书还是记不住多少的,写篇博客记录自己所学的只是还是很有必要的,学习贵在坚持. 单例模 ...
- 设计模式C#合集--单例模式
单例模式 代码: 第一种: private static Singleton singleton = null; private Singleton() { } public static Singl ...
- 设计模式之单例模式(Singleton)
设计模式之单例模式(Singleton) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...
- GOF23设计模式之单例模式
·核心作用: -保证一个类只有一个实例,并且提供一个访问该实例的全局访问点. ·常见应用场景: -Windows的Task Manager(任务管理器)就是很典型的单例模式 -Windows的Recy ...
- GJM : C#设计模式(1)——单例模式
感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...
- PHP设计模式(四)单例模式(Singleton For PHP)
今天讲单例设计模式,这种设计模式和工厂模式一样,用的非常非常多,同时单例模式比较容易的一种设计模式. 一.什么是单例设计模式 单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对 ...
- java设计模式之单例模式(几种写法及比较)
概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...
随机推荐
- ubuntu 14.04加入五笔输入法
快捷键"ctrl+AIt+T",弹出终端,输入以下指令 //先卸载IBUS输入法 killall ibus-daemon sudo apt- get purge ibus ibus ...
- Python批量修改文件名
处理语料库时,有些文件名字很不规则,为了方便处理,同义按数字顺序修改名称,主要是用到os模块: import os def RenameFiles(srcdir): #将目录下所有的文件命名为数字开头 ...
- 2014 New Year’s First Blog
新年开篇博客,依旧是流水账. 读到一篇强文,<关于两个世界体系的对话>.common practice 往往是针对某种语言或者特定技术为背景,然而,很多时候,common practice ...
- linux 常用命令大全
linux 常用命令大全 系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统 ...
- elixir 高可用系列(一) Agent
概述 elixir 本身是一种 immutable 的语言,默认情况下,进程间是不共享任何状态的,进程之间通过消息来交互. 而 Agent 则封装了一种进程间共享状态的方式,通过这种方式,不用显式的写 ...
- log4net简单配置内容
首先将log4net.dll下载来,添加到项目引用中: 在assembly文件最后面加(其实没关系的): [assembly: log4net.Config.XmlConfigurator(Confi ...
- 【Windows 10 IoT - 2】LED闪烁及动画绘制(树莓派 Pi2)
在上一篇博文<Windows 10 IoT系统安装>中,我们实现了在树莓派2平台上运行Window 10 IoT,本篇文章将介绍在该平台上的程序开发. 在最初获得的资讯中,以为Window ...
- 【Leetcode】【Hard】Merge Intervals
Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6],[8,1 ...
- 用SQL语句断开某个数据库的所有活动连接
每次一执行完一个数据库脚本,想要做一些别的操作的时候(比如还原数据库),老是有数据库活动连接,烦不胜烦(如下图所示). 下面给出一种删除数据库活动连接的方式.将下面代码段中的“--修改一下”处的数据库 ...
- 《介绍一款开源的类Excel电子表格软件》续:七牛云存储实战(C#)
两个月前的发布的博客<介绍一款开源的类Excel电子表格软件>引起了热议:在博客园有近2000个View.超过20个评论. 同时有热心读者电话咨询如何能够在SpreadDesing中实现存 ...