【16】C++实现单例模式

       只能生成一个实例的类是实现了单例模式的类型,由于只能生成一个实例对象所以类的构造函数必须是private,因为类的构造函数是private我们只能通过类访问类的静态成员函数构造出一个实例。

1. 单线程环境

//实现单例模式
class SingleTon{
public:
	static SingleTon* GetInstance(void);
	static void DeleteInstance(void);
private:
	static SingleTon *singleTon;
	SingleTon(void){}
};

//初始化singleTon变量
SingleTon* SingleTon::singleTon = NULL;

//实现构造对象方法
SingleTon* SingleTon::GetInstance(void){
	if(singleTon == NULL){
	    singleTon = new SingleTon();
	}
	return singleTon;
}

//实现销毁对象方法
void SingleTon::DeleteInstance(void){
    delete singleTon;
    singleTon = NULL;
}

int main(){
	SingleTon *singleTon = SingleTon::GetInstance(); //生成一个实例对象之后无法再生成对象
	return 0;
}

2. 多线程环境

(1)由于多线程的问题,单线程的代码可能会有问题。如果多个线程同时运行到if(singleTon == NULL)并且singleTon确实还没有创建,那么这个时候讲会创建出多个实例对象,所以为了保证多线程环境下也满足单例模式,我们可以采用在代码中加上一个同步锁。

(2)GetInstance函数中之所以写了两个if(singleTon == NULL),可以做到只在第一次创建实例化对象的时候才加锁,因为创建对象之后singleTon不再为NULL。如果只写一个if语句,这样每次调用都要加锁降低效率

(3)lock和unlock函数是C++ 11中的函数,我在VS2010中没有找到。。。

class SingleTon{
public:
	static SingleTon* GetInstance(void);
	static void DeleteInstance(void);
private:
	static SingleTon *singleTon;
	SingleTon(void){}
};

//初始化singleTon变量
SingleTon* SingleTon::singleTon = NULL;

//实现构造对象方法
SingleTon* SingleTon::GetInstance(void){
	/*
	之所以在内部加同步锁,这样可以不用每次调用都加锁,只有对象
	singleTon为NULL的时候才会加锁,提高效率。
	*/
	if(singleTon == NULL){
		lock(); //加锁
		if(singleTon == NULL){
	            singleTon = new SingleTon();
		}
		unlock(); //解锁
	}
	return singleTon;
}

//实现销毁对象方法
void SingleTon::DeleteInstance(void){
    delete singleTon;
    singleTon = NULL;
}

单例模式应用场景:windows 的任务管理器、windows 的回收站、日志文件、web 应用配置对象读取、操作系统的文件系统、数据库连接池、多线程的线程池、每台计算机只有一个键盘、只有一个鼠标等等。

时间: 2024-09-19 09:01:19

【16】C++实现单例模式的相关文章

减小内存的占用问题——享元模式和单例模式的对比分析

俗话说,自己写的代码,6个月后也是别人的代码--复习!复习!复习!总结的知识点如下: 享元模式概念和实现例子 使用了享元模式的Java API String类 java.lang.Integer 的 valueOf(int)方法源码分析 使用享元模式的条件 享元模式和单例模式的区别 前面的策略模式的话题提起了:如何解决策略类膨胀的问题,说到 "有时候可以通过把依赖于环境Context类的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用."换言之,可以使

解读设计模式----单例模式(Singleton Pattern)

单例模式可以保证一个类有且只有一个实例,并提供一个访问它的全局访问点.在程序设计中,有很多情况需要确保一个类只能有一个实例.从这句话可以看出,Singleton模式的核心:如何控制用户使用new对一个类的实例构造器的任意调用.如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?这应该是类设计者的责任,而不是使用者的责任. 一.单例模式意图 保证一个类有且只有一个实例,并提供一个访问它的全局访问点. 二.单例模式UML图(该图来至http://www.dofactory.com/) 三.示

PHP单例模式详细介绍

  这篇文章主要介绍了PHP单例模式详细介绍,本文讲解了单例模式的概念.单例模式的特点.使用单例模式的原因及场景及PHP单例模式代码实例,需要的朋友可以参考下 单例模式的概念 单例模式是指整个应用中某个类只有一个对象实例的设计模式.具体来说,作为对象的创建方式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局的提供这个实例.它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用. 单例模式的特点 单例模式的主要特点是"三私一公": 需要一个保存类的唯一实例的私有静

JS模式之单例模式基本用法

  本文实例讲述了JS模式之单例模式基本用法.分享给大家供大家参考.具体如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 //singleton var SingletonTester = (function(){ function Singleton(options){ options = options || {}; this.name = "SingletonTester"; this.pointX = opt

php设计模式之单例模式实例分析

 这篇文章主要介绍了php设计模式之单例模式,实例分析了单例模式的原理与相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了php设计模式之单例模式.分享给大家供大家参考.具体分析如下: 单例模式(职责模式): 简单的说,一个对象(在学习设计模式之前,需要比较了解面向对象思想)只负责一个特定的任务: 单例类: 1.构造函数需要标记为private(访问控制:防止外部代码使用new操作符创建对象),单例类不能在其他类中实例化,只能被其自身实例化: 2.拥有一个保存类的实

软件开发常用设计模式—单例模式总结(c++版)

单例模式:就是只有一个实例. singleton pattern单例模式:确保某一个类在程序运行中只能生成一个实例,并提供一个访问它的全局访问点.这个类称为单例类.如一个工程中,数据库访问对象只有一个,电脑的鼠标只能连接一个,操作系统只能有一个窗口管理器等,这时可以考虑使用单例模式. 众所周知,c++中,类对象被创建时,编译系统为对象分配内存空间,并自动调用构造函数,由构造函数完成成员的初始化工作,也就是说使用构造函数来初始化对象. 1.那么我们需要把构造函数设置为私有的 private,这样可

java-Android 使用单例模式创建数据库中的问题

问题描述 Android 使用单例模式创建数据库中的问题 如图调用getInstance来获取实例,行参是Context类,此处填了this.如果数据库还没有创建,就会自动调用私有化的构造方法,我的问题是,构造方法处的Context表示什么?实在不理解啊... 解决方案 先说一点, 单例模式里面 CoolWeatherDB应该是private的 否则外面都能直接访问了context就是上下文,包含了下页面跳转的参数什么的 解决方案二: 你传的什么就是什么,多多数可能是activity,或者其他你

单例模式

主要介绍单例模式的一种写法.注意事项.作用.测试,以Java语言为例,下面代码是目前见过最好的写法: Java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public class Singleton { private static volatile Singleton instance = null; // private constructor suppresses private Singleton(){ } public

iOS设计模式 - 单例模式

IOS设计模式单例类 Made By HeYang 内容大纲: 1.单例模式 2.编写严格的单例 3.利用单例模式优化本地存储 4.重写allocWithZone实现单例 5.使用异常处理强制避免init创建实例 6.MRC下的单例模式,然后宏定义抽取单例类(兼顾ARC和MRC) 7.附录 1.单例模式 单例模式的描述: 系统中的一个类只提供一个实例供外界使用. 下面举几个IOS开发中常用的几个单例: [[UIApplication sharedApplication] statusBarFra