3创建型模式之单例模式
模式 创建 单例
2023-09-11 14:21:07 时间
概念
单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象。也就是说,在整个程序空间中,该类只存在一个实例对象。
GoF对单例模式的定义是:保证一个类、只有一个实例存在,同时提供能对该实例加以访问的全局访问方法。
为什么使用单例模式?
在应用系统开发中,我们常常有以下需求:
- 在多个线程之间,比如初始化一次socket资源;比如servlet环境,共享同一个资源或者操作同一个对象
- 在整个程序空间使用全局变量,共享资源
- 大规模系统中,为了性能的考虑,需要节省对象的创建时间等等。
因为Singleton模式可以保证为一个类只生成唯一的实例对象,所以这些情况,Singleton模式就派上用场了。
实现单例步骤常用步骤
a) 构造函数私有化
b) 提供一个全局的静态方法(全局访问点)
c) 在类中定义一个静态指针,指向本类的变量的静态变量指针
饿汉式单例和懒汉式单例
#include <iostream> using namespace std; //懒汉式 class Singelton { private: Singelton() { m_singer = NULL; m_count = 0; cout << "构造函数Singelton ... do" << endl; } public: static Singelton *getInstance() { if (m_singer == NULL ) //懒汉式:1 每次获取实例都要判断 2 多线程会有问题 { m_singer = new Singelton; } return m_singer; } static void printT() { cout << "m_count: " << m_count << endl; } private: static Singelton *m_singer; static int m_count; }; Singelton *Singelton::m_singer = NULL; //懒汉式 并没有创建单例对象 int Singelton::m_count = 0; void main01_1() { cout << "演示 懒汉式" << endl; Singelton *p1 = Singelton::getInstance(); //只有在使用的时候,才去创建对象。 Singelton *p2 = Singelton::getInstance(); if (p1 != p2) { cout << "不是同一个对象" << endl; } else { cout << "是同一个对象" << endl; } p1->printT(); p2->printT(); system("pause"); return ; }
//饿汉式 class Singelton2 { private: Singelton2() { m_singer = NULL; m_count = 0; cout << "构造函数Singelton ... do" << endl; } public: static Singelton2 *getInstance() { // if (m_singer == NULL ) // { // m_singer = new Singelton2; // } return m_singer; } static void Singelton2::FreeInstance() { if (m_singer != NULL) { delete m_singer; m_singer = NULL; m_count = 0; } } static void printT() { cout << "m_count: " << m_count << endl; } private: static Singelton2 *m_singer; static int m_count; }; Singelton2 *Singelton2::m_singer = new Singelton2; //不管你创建不创建实例,均把实例new出来 int Singelton2::m_count = 0; void main() { cout << "演示 饿汉式" << endl; Singelton2 *p1 = Singelton2::getInstance(); //只有在使用的时候,才去创建对象。 Singelton2 *p2 = Singelton2::getInstance(); if (p1 != p2) { cout << "不是同一个对象" << endl; } else { cout << "是同一个对象" << endl; } p1->printT(); p2->printT(); Singelton2::FreeInstance(); Singelton2::FreeInstance(); system("pause"); }
相关文章
- 创建型、结构型、行为型模式(1)
- C++设计模式 ==> 简单工厂模式
- 单例模式
- 从观察者模式谈论 : Spring Boot中创建、发布和侦听自定义事件
- Multi-Cloud模式下Terraform和Packer开源工具实践分享
- 设计模式--创建性模式--原型
- 精读JavaScript模式(四),数组,对象与函数的几种创建方式
- 模板方法模式
- 《敏捷软件开发:原则、模式与实践(C#版.修订版)》一第二部分 敏捷设计
- 初学Java常用设计模式之——装饰器模式
- 《Python编程实战:运用设计模式、并发和程序库创建高质量程序》—— 2.2 桥接模式
- 《软件建模与设计: UML、用例、模式和软件体系结构》一一3.3 软件生存周期的活动
- 【转载】 大端模式和小端模式的区别是什么?
- share point CSOM 客户端模式 创建表 增删改查
- Java设计模式之创建型:单例模式
- 半同步/半异步并发模式进程池实现
- 8创建型模式之原型模式
- 7创建型模式之建造者模式
- 4创建型模式之单例模式__多线程下的懒汉式单例和饿汉式单例
- 设计模式(二): BUILDER生成器模式 -- 创建型模式
- Prototype原型模式(创建型模式)
- JavaScript之面向对象学习七(动态原型模式、寄生构造函数模式、稳妥构造函数模式创建自定义类型)
- 深入理解JavaScript系列(48):对象创建模式(下篇)
- C# 单例模式的多种简单实现
- Java设计模式_创建型模式_单例模式
- 【设计模式】-创建型模式-第2章第5讲-【对象池模式】
- 【设计模式】-创建型模式-第2章第1讲-【单例模式】
- 对称加密和分组加密中的四种模式(ECB、CBC、CFB、OFB)