博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式---单例模式(C++)
阅读量:3943 次
发布时间:2019-05-24

本文共 3159 字,大约阅读时间需要 10 分钟。

1. 单例模式

#include 
#include
using std::cout;using std::endl;class Singleton{
public: static Singleton * getInstance() {
if(_pInstance == NULL) {
_pInstance = new Singleton(); } return _pInstance; } static void destroy() {
if(_pInstance) {
delete _pInstance; } }private://构造函数私有化 Singleton(){
cout << "Singleton()" << endl;} ~Singleton(){
cout << "~Singleton()" << endl;} static Singleton * _pInstance;};Singleton * Singleton::_pInstance = NULL;

2.懒汉、饿汉模式

// **********************************************************

// * Author : liankang
// * Email : 349915905@qq.com
// * Create time : 2019-07-30 21:56
// * Filename : Singleton1.cc
// * Description :
// **********************************************************
#include <stdlib.h>

#include

using std::cout;

using std::endl;
using std::cin;

//单例对象自动释放

//方法一:静态成员函数 + atexit

class Singleton{
public: static Singleton* getInstance() {
//非线程安全 //加锁 if(NULL == _pInstance) {
::atexit(destroy); _pInstance = new Singleton(); } return _pInstance; } static void destroy() {
if(_pInstance) {
delete _pInstance; } }private: Singleton() {
cout << "Singleton()" << endl; } ~Singleton() {
cout << "~Singleton()" << endl; }private: //非静态数据成员就是单例对象的一部分 static Singleton* _pInstance;};//Singleton * Singleton::_pInstance = nullptr;//懒(懒加载)汉模式//在进入main函数之前就创建单例对象Singleton * Singleton::_pInstance = getInstance();//饿汉模式

3. 线程安全

// **********************************************************// * Author        : liankang// * Email         : 349915905@qq.com// * Create time   : 2019-07-30 21:56// * Filename      : Singleton1.cc// * Description   : // **********************************************************#include 
#include
#include
using std::cout;using std::endl;using std::cin;//单例对象自动释放//方法三: pthread_once + atexitclass Singleton{
public: static Singleton* getInstance() {
//多线程安全 pthread_once(&_once, init); return _pInstance; } static void init() {
_pInstance = new Singleton(); ::atexit(destroy); } static void destroy() {
if(_pInstance) {
delete _pInstance; } }private: Singleton() {
cout << "Singleton()" << endl; } ~Singleton() {
cout << "~Singleton()" << endl; }private: //非静态数据成员就是单例对象的一部分 static Singleton* _pInstance; static pthread_once_t _once;};Singleton * Singleton::_pInstance = nullptr;//懒(懒加载)汉模式pthread_once_t Singleton::_once = PTHREAD_ONCE_INIT;//在进入main函数之前就创建单例对象int main(int argc, char** argv){
Singleton* p1 = Singleton::getInstance(); Singleton* p2 = Singleton::getInstance(); Singleton* p3 = Singleton::getInstance(); cout << "p1 = " << p1 << endl << "p2 = " << p2 << endl << "p3 = " << p3 << endl; return 0;}

转载地址:http://etjwi.baihongyu.com/

你可能感兴趣的文章
System.getProperty()系统参数
查看>>
Linux系统下批量删除.svn目录
查看>>
大数据行业应用趋势
查看>>
Mac + Rails3 + MongoDB的Demo工程搭建
查看>>
隐藏于Python内的设计之禅彩蛋
查看>>
VSCode配置C/C++环境
查看>>
OTB测试之Visual Tracker Benchmark v1.0全过程配置流程
查看>>
缓存在Springboot应用中的使用
查看>>
Linux(一)- 认识Linux
查看>>
Linux(二)- Linux常用命令
查看>>
Linux(三)- Java开发环境搭建
查看>>
Linux(四)- Ubuntu安装Mysql
查看>>
Ubuntu安装开发环境
查看>>
Deepin开发环境安装
查看>>
Spring入门
查看>>
网址大全
查看>>
Git的使用
查看>>
Linux域名IP映射
查看>>
Java的反射机制
查看>>
SpringCloud微服务应用入门
查看>>