介绍

几个重点:

  • 构造函数为private
  • 提供一个获取单例对象指针的函数
  • 一个静态指针成员存储单例对象

注意:

  • 获取单例对象也可以获取对象引用,但要注意拷贝构造函数和赋值运算符
  • 如果有多线程访问单例,需要注意线程同步

UML类图:

简单示例:

懒汉和饿汉模式:

#ifndef SIMPLE_SINGLETON_H
#define SIMPLE_SINGLETON_H#include <iostream>
using namespace std;/*** @brief The LazySingleton class* 懒汉模式*/
class LazySingleton
{
public:static LazySingleton *getInstance(){if( m_instance == nullptr)m_instance = new LazySingleton;return  m_instance;}static void freeInstance(){if( m_instance != nullptr )delete  m_instance;m_instance = nullptr;}
private:LazySingleton(){cout<<" LazySingleton 构造函数执行"<<endl;}static LazySingleton *m_instance ;
};
LazySingleton *LazySingleton::m_instance = nullptr;/*** @brief The HungrySingleton class* 饿汉模式,一般用不到*/
class  HungrySingleton
{
public:static HungrySingleton *getInstance(){if( m_instance == nullptr)m_instance = new HungrySingleton;return  m_instance;}static void freeInstance(){if( m_instance != nullptr )delete  m_instance;m_instance = nullptr;}
private:HungrySingleton(){cout<<" HungrySingleton 构造函数执行"<<endl;}static HungrySingleton *m_instance ;
};
HungrySingleton *HungrySingleton::m_instance = new HungrySingleton;#endif // SIMPLE_SINGLETON_H

懒汉线程安全模式:

#ifndef THREAD_SINGLETON_H
#define THREAD_SINGLETON_H#include <iostream>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
using namespace std;void printids(const char *s)
{pid_t pid;pthread_t tid;pid = getpid();tid = pthread_self();printf("%s pid %u tid %u (0x%x)\n", s, (unsigned int) pid,(unsigned int) tid, (unsigned int) tid);
}class LazySingleton
{
public:static LazySingleton *getInstance(){//        if( m_instance == nullptr)
//        {
//            m_count++;
//            m_instance = new LazySingleton;
//        }if( m_instance == nullptr){pthread_mutex_lock(&m_mutex_lock);if( m_instance == nullptr){m_count++;m_instance = new LazySingleton;}pthread_mutex_unlock(&m_mutex_lock);}return  m_instance;}static void freeInstance(){if( m_instance != nullptr )delete  m_instance;pthread_mutex_destroy(&m_mutex_lock);m_instance = nullptr;}void showMessage(){cout<<"LazySingleton message!"<<endl;}
private:LazySingleton(){cout<<" LazySingleton 构造函数执行开始"<<endl;sleep(2);cout<<" LazySingleton 构造函数执行 ["<<m_count<<"] 次"<<endl;}static LazySingleton *m_instance ;static int m_count;static pthread_mutex_t m_mutex_lock;
};
LazySingleton *LazySingleton::m_instance = nullptr;
int LazySingleton::m_count = 0;
pthread_mutex_t LazySingleton::m_mutex_lock = PTHREAD_MUTEX_INITIALIZER;void *thr_fn(void *arg)
{// printids("new thread: ");LazySingleton::getInstance()->showMessage();return nullptr;
}#endif // THREAD_SINGLETON_H

线程安全,调用方式:

 printids("main thread:");int err;pthread_t ntid[3];for (int i=0 ; i<3 ; i++) {err = pthread_create(&ntid[i], NULL, thr_fn, NULL);if (err != 0)printf("can't create thread: %s\n", strerror(err));}for (int i=0; i < 3 ; i++) {pthread_join(ntid[i],NULL);}

内部静态类(懒汉)方式:


class  StackSingleton
{
public:static StackSingleton *getInstance(){//内部静态实例的懒汉模式pthread_mutex_lock(&m_mutex_lock);static StackSingleton _instance ;pthread_mutex_unlock(&m_mutex_lock);return  &_instance;}void printS(){cout<<"栈方式的单例模式..."<<endl;}private:StackSingleton(){cout<<" StackSingleton 构造函数执行"<<endl;}static pthread_mutex_t m_mutex_lock;};
pthread_mutex_t StackSingleton::m_mutex_lock = PTHREAD_MUTEX_INITIALIZER;

设计模式之 单例模式相关推荐

  1. socket可以写成单例嘛_精读《设计模式 - Singleton 单例模式》

    Singleton(单例模式) Singleton(单例模式)属于创建型模式,提供一种对象获取方式,保证在一定范围内是唯一的. 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 其实单例模 ...

  2. C#设计模式(1)——单例模式

    原文地址:http://www.cnblogs.com/zhili/p/SingletonPatterm.html 一.引言 最近在设计模式的一些内容,主要的参考书籍是<Head First 设 ...

  3. java设计模式之单例模式(七种方法)

    单例模式:个人认为这个是最简单的一种设计模式,而且也是在我们开发中最常用的一个设计模式. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个 ...

  4. java单例模式的七种写法_Java设计模式之单例模式的七种写法

    什么是单例模式? 单例模式是一种常见的设计模式,单例模式的写法有很多种,这里主要介绍三种: 懒汉式单例模式.饿汉式单例模式.登记式单例 . 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类 ...

  5. go设计模式之单例模式

    在这里插入图片描述# go设计模式之单例模式 在软件开发时,经常会遇到有些对象需要保证只有一个实例的,那么这种设计模式就应用而生. 定义 单例模式,也叫单子模式,是一种常用的软件设计模式,属于创建型模 ...

  6. 一篇博客读懂设计模式之---单例模式

    一篇博客读懂设计模式之---单例模式 一.  单例模式 单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处 ...

  7. Java 设计模式(3)单例模式

    前言 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自 ...

  8. socket可以写成单例嘛_精读设计模式 Singleton 单例模式

    Singleton(单例模式) Singleton(单例模式)属于创建型模式,提供一种对象获取方式,保证在一定范围内是唯一的. 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 其实单例模 ...

  9. 设计模式之单例模式——Singleton

                        设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...

  10. 实践GoF的设计模式:单例模式

    本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:单例模式>,作者: 元闰子. 简述 GoF 对单例模式(Singleton)的定义如下: Ensure a class onl ...

最新文章

  1. 伯克利新无监督强化学习方法:减少混沌所产生的突现行为
  2. python求点到曲线距离_Python。如何从点和偏移距离的x,y列表中获取偏移样条曲线的x,y坐标...
  3. ORACLE sqlplus set 命令速查
  4. 让vue-router渲染为指定的标签
  5. 局域网网管软件_网管软件有哪些?那些不同之处
  6. 最让人头疼的清洗数据过程----选择合适的方式快速命中所需的数据
  7. Java实现的日历(原创)
  8. html选择区域高亮,css+js实现部分区域高亮可编辑遮罩层
  9. atitit.条形码的原理与生成总结java Barcode4j barcode o5
  10. 'gbk' codec can't encode character解决方法
  11. Android 平台视频播放器demo
  12. 10.深入浅出:反馈的概念及判断——参考《模拟电子技术基础》清华大学华成英主讲
  13. 产品读书《缔造企鹅:产品经理是这样炼成的》
  14. 查看CentOS版本信息
  15. nc 自开节点做参照_NC6period;3常见问题记录
  16. VMware14 黑屏问题
  17. 【postgresql】 获取月初月末日期
  18. UiPath认证流程
  19. webrtc jitter buffer
  20. pat1121 Damn Single

热门文章

  1. 51单片机-6-矩阵键盘
  2. icmp协议 主机探测 java 网盘_ping 原理与ICMP协议
  3. 计算机和网络的不同,为什么网吧的计算机和网络如此流畅,与家庭网络有什么区别?...
  4. Ubuntu 22.04 Qt5.12.9编译出现“cannot find -lGL”解决
  5. 前端小字典 (2)– Base64
  6. XP下安装openssl的过程
  7. 电子邮件系统哪个好?分享2022电子邮件系统排名大全及主要功能
  8. 毕业设计-基于微信小程序的员工培训系统
  9. vue纯前端下载表格
  10. [Unity3D]Unity3D游戏开发之仿仙剑奇侠传四角色控制效果