单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

单例模式中的角色和职责


Singleton(单例):在单例类的内部实现只生成一个实例,同时它提供一个静态的getInstance()工厂方法,让客户可以访问它的唯一实例;为了防止在外部对其实例化,将其构造函数设计为私有;在单例类内部定义了一个Singleton类型的静态对象,作为外部共享的唯一实例。
如何构建单例:
一是单例模式的类只提供私有的构造函数,
二是类定义中含有一个该类的静态私有对象,
三是该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;/* 懒汉式 */
class Chairman_lazy
{private:Chairman_lazy() {}
public:static Chairman_lazy* getInstance() {if (s_singleton == NULL) {s_singleton = new Chairman_lazy;}return s_singleton;}
private:static Chairman_lazy* s_singleton;
};
Chairman_lazy* Chairman_lazy::s_singleton = nullptr;void test01()
{Chairman_lazy* chairman1 = Chairman_lazy::getInstance();Chairman_lazy* chairman2 = Chairman_lazy::getInstance();if (chairman1 == chairman2) {cout << "指向同一个对象!" << endl;}else {cout << "指向不是同一个对象!" << endl;}}/* 饿汉式 */
class Chairman_hangry
{private:Chairman_hangry() {}
public:static Chairman_hangry* getInstance() {return s_singleton;}
private:static Chairman_hangry* s_singleton;
};//初始化
Chairman_hangry* Chairman_hangry::s_singleton = new Chairman_hangry;void test02() {Chairman_hangry* chairman1 = Chairman_hangry::getInstance();Chairman_hangry* chairman2 = Chairman_hangry::getInstance();if (chairman1 == chairman2) {cout << "指向同一个对象!" << endl;}else {cout << "指向不是同一个对象!" << endl;}
}int main() {test01();test02();system("pause");return EXIT_SUCCESS;
}

注意:静态变量必须在类外进行初始化,否则编译不过

饿汉式还可以使用静态变量得方式:

class Lazy
{private:Lazy() {}
public:static Lazy* getInstance(){static Lazy lazy;return &lazy;}
};int main()
{Lazy *pLazy = Lazy::getInstance();Lazy *pLazy2 = Lazy::getInstance();cout << pLazy << endl;cout << pLazy2 << endl;return 0;
}

单例碰到多线程

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<Windows.h>
using namespace std;/* 懒汉式 */
class Chairman_lazy
{private:Chairman_lazy() {}
public:static Chairman_lazy* getInstance() {if (s_singleton == NULL) {//Sleep(1000); //等到1000秒s_singleton = new Chairman_lazy;}return s_singleton;}
private:static Chairman_lazy* s_singleton;
};Chairman_lazy* Chairman_lazy::s_singleton = NULL;/* 饿汉式 */
class Chairman_hangry
{private:Chairman_hangry() {}
public:static Chairman_hangry* getInstance() {return s_singleton;}
private:static Chairman_hangry* s_singleton;
};//初始化
Chairman_hangry* Chairman_hangry::s_singleton = new Chairman_hangry;DWORD WINAPI MyThread_hangry(LPVOID lpThreadParameter)
{Chairman_hangry* chairman = Chairman_hangry::getInstance();cout << "单例对象地址:" << (int*)chairman << endl;return 0;
}//饿汉式单例碰到多线程测试
void test01()
{HANDLE handler[10];for (int i = 0; i < 10; i++) {handler[i] = CreateThread(NULL, NULL, MyThread_hangry, NULL, NULL, NULL);}}DWORD WINAPI MyThread_lazy(LPVOID lpThreadParameter)
{Chairman_lazy* chairman = Chairman_lazy::getInstance();cout << "单例对象地址:" << (int*)chairman << endl;return 0;
}//懒汉式单例碰到多线程
void test02()
{HANDLE handler[10];for (int i = 0; i < 10; i++) {handler[i] = CreateThread(NULL, NULL, MyThread_lazy, NULL, NULL, NULL);}}int main() {//test01();test02();system("pause");return EXIT_SUCCESS;
}

Test01函数执行结果(饿汉式单例模式):

Test02函数执行结果(懒汉式单例模式):

从结果可以看出,饿汉式多线程环境没有问题,而懒汉式多线程环境会存在问题,主要时由于在判断对象为空时可能多个线程都进来了导致多次new对象,解决这种方式的问题就是加锁。

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<Windows.h>
#include <mutex>
using namespace std;/* 懒汉式 */
class Chairman_lazy
{private:Chairman_lazy() {}
public:static Chairman_lazy* getInstance() {if (s_singleton)return s_singleton;m_mutex.lock();if (s_singleton == NULL) {//Sleep(1000); //等到1000秒s_singleton = new Chairman_lazy;}return s_singleton;}
private:static Chairman_lazy* s_singleton;static mutex m_mutex;
};Chairman_lazy* Chairman_lazy::s_singleton = NULL;
mutex Chairman_lazy::m_mutex;

单例模式的优缺点

优点:
(1)单例模式提供了对唯一实例的受控访问。
(2)节约系统资源。由于在系统内存中只存在一个对象。

缺点:
(1) 扩展略难。单例模式中没有抽象层。
(2) 单例类的职责过重。

创建型模型-单例模式相关推荐

  1. 设计模式——创建型模型

    目录 单例模式(singleton) 构建模式(Builder) 原型模式(Prototype) 工厂方法模式(Factory) 抽象工厂模式(Abstract Factory) ** 一.5种创建型 ...

  2. 设计模式----创建型设计模式(单例模式、工厂方法模式、构建者模式)

    创建型设计模式 单例模式(Singleton Pattern) 单例模式介绍 代码演示 饿汉式(静态常量) 饿汉式(静态代码块) 懒汉式(线程不安全) 懒汉式(线程安全,同步方法) 懒汉式(线程安全, ...

  3. 创建型模式-单例模式、工厂模式

    目录 创建型模式特点 创建型模式分类 1.单例模式(Singleton Pattern) 单例介绍 代码演示 ①饿汉式(静态常量) ②饿汉式(静态代码块) ③懒汉式(线程不安全) ④懒汉式(线程安全, ...

  4. Java设计模式之创建型:单例模式

    一.什么是单例模式: 单例模式可以确保系统中某个类只有一个实例,该类自行实例化并向整个系统提供这个实例的公共访问点,除了该公共访问点,不能通过其他途径访问该实例.单例模式的优点在于: 系统中只存在一个 ...

  5. python创建模式对象_【python设计模式-创建型】单例模式

    单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式涉及到一个单一的类,该类负责创建自己的对 ...

  6. 软件设计模式--第二章 创建型模式-- 单例模式

    目录 第二章 创建型模式 1.创建型模式概述 2.单例模式(Singleton) (1)模式的定义与特点 (2)模式的结构与实现 (3)应用场景 (4)扩展 第二章 创建型模式 1.创建型模式概述 主 ...

  7. 软件架构设计师-创建型模式-单例模式-原型模式-工厂方法模式-抽象工厂模式-建造者模式

    文章目录 1.单例模式 2.原型模式 3.工厂方法(Factory Method)模式 4.抽象工厂(AbstractFactory)模式 5.建造者(Builder)模式 6.作者答疑   在面向对 ...

  8. 创建型模式—单例模式

    原文作者:C语言中文网 原文地址:单例模式(单例设计模式)详解 目录 1.单例模式的定义与特点 单例类对外提供一个访问该单例的全局访问点. 2.单例模式的优点和缺点 3.单例模式的应用场景 4.单例模 ...

  9. 设计模式---(创建型)单例模式

    概念 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果 ...

最新文章

  1. 粒子滤波 应用_如何使用NativeScript开发粒子物联网应用
  2. 圣才电子书怎么提取pdf_总结10个免费网站,助你解决PDF所有问题!
  3. SpringBoot 使用(三): 配置文件详解
  4. nebual的图数据结构
  5. linux关闭防火墙命令firewall
  6. java web 开发之写在前面(0)
  7. 重复类发展手法_正确的护肤手法(动态演示),喜欢就拿去收藏吧!
  8. python自动化面试提问_Python自动化测试笔试面试题精选
  9. CSS:input输入框以及button按钮初始细节
  10. 十四步实现强大的五子棋AI
  11. java compar_Java中Comparable和Comparator
  12. Redis开发运维实践开发者设计规范之延迟考虑
  13. c语言将一句英文逆序输出,C++实现英文句子中的单词逆序输出的方法
  14. 软件工程-----人员组织方式
  15. 值传递和引用传递是什么?
  16. 电商项目相关面试问题及答案
  17. 教学|3D建模之,游戏场景创建大致流程
  18. yolov5 目标检测算法
  19. 何谓-全无线UWB定位系统
  20. WordPress网站备份与还原

热门文章

  1. android dat 乱码,微信dat文件打开乱码
  2. IOS 屏幕适配(一)理论篇
  3. java中父类与子类有相同属性调谁?取决于左边
  4. 神经网络适用于什么问题,神经网络和计算机网络
  5. 1990-2020年各行业竞争度--赫芬达尔指数表
  6. 51单片机89C516笔记(一)
  7. SMU激活函数讲解及代码实现
  8. 超神学院德诺计算机,超神学院:扒一扒隐藏起来的人物,德诺星系的人有没有活下来的?...
  9. 关于符合车规的高精度定位产品
  10. PTA 6 家庭土地管理 分数 10