设计模式之单例模式

参考: 设计模式笔记

对于一个类A而言,整个系统中只能有一个该类的对象实例。比如,window的资源管理器,整个系统只有一个,每次打开的都是唯一的一个;一个班级只有一个班主任;一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。

单例模式优缺点与适用场景

优点

  1. 在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。
  2. 避免对资源的多重占用

缺点

没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

适用场景

  1. 要求生产唯一序列号。
  2. WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。
  3. 创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。

单例模式实现步骤

  1. 构造函数私有化
  2. 增加静态私有的当前类的指针
  3. 提供静态的对外接口,可以让用户获取单例对象

原理

静态方法只能访问静态成员,而只有静态成员可以在没有创建对象的时候进行初始化,而且类的静态成员在第一次被初始化之后就不会再被初始化了,保证单例。

饿汉式创建(线程安全)

静态私有的当前类的指针,在类外直接完成类的初始化,这个初始化是在main函数之前执行的。

cpp 复制代码
#include<iostream>
using namespace std;
class Singleton_hungry{
private:
    Singleton_hungry(){cout<<"hungry"<<endl;}
    static Singleton_hungry*instance;
public:
    static Singleton_hungry*getInstance(){
        return instance;
    }
};

//先于main进行初始化构造
Singleton_hungry*Singleton_hungry::instance=new Singleton_hungry();
int main(){
    cout<<"main"<<endl;
    Singleton_hungry*instance=Singleton_hungry::getInstance();
    return 0;
}
cpp 复制代码
hungry
main

懒汉式创建

静态私有的当前类的指针,在需要用的时候才会创建。

cpp 复制代码
#include<iostream>
using namespace std;
class Singleton_lazy{
private:
    Singleton_lazy(){cout<<"lazy"<<endl;}
    static Singleton_lazy*instance;
public:
    static Singleton_lazy*getInstance(){
        if(instance==nullptr) instance=new Singleton_lazy();
         return instance;
    }
   
};

//先于main进行初始化构造
Singleton_lazy*Singleton_lazy::instance=NULL;
int main(){
    cout<<"main"<<endl;
    Singleton_lazy*instance=Singleton_lazy::getInstance();
    return 0;
}
cpp 复制代码
main
lazy

为什么懒汉式创建是线程不安全的?

假设开始线程0进入,判断instance为空,在将要创建实例时,cpu切换;线程1又进来了,同样instance为空,创建了实例,这时cpu切换回来到0线程,继续创建实例。

这样就创建了两个实例!就不再是单例模式了。

如何使得懒汉模式线程安全?

双重锁

单例对象释放

程序结束的时候,系统自动回收当前程序所有内存,一般不需要手动释放。

相关推荐
Anurmy6 小时前
设计模式之构建器模式
设计模式
鱼骨不是鱼翅8 小时前
个人简历面试复习-----设计模式篇(一)
设计模式
电子科技圈9 小时前
从工具到平台:如何化解跨架构时代的工程开发和管理难题
人工智能·设计模式·架构·编辑器·软件工程·软件构建·设计规范
Anurmy10 小时前
设计模式之装饰模式
设计模式
TimberWill11 小时前
优化if else过多的方案(含设计模式处理方式)
java·设计模式
@insist12311 小时前
软件设计师-结构型与行为型设计模式全解:软考设计模式考点一站式通关
设计模式·软考·软件设计师·软件水平考试
JTCC13 小时前
Java 设计模式西游篇 - 第五回:装饰者模式添法力 悟空披挂新战袍
java·观察者模式·设计模式
逆境不可逃14 小时前
【从零入门23种设计模式13】行为型之责任链模式
算法·leetcode·游戏·设计模式·责任链模式
Thomas.Sir15 小时前
SpringMVC 工作原理深入解析
spring·设计模式·mvc·spring mvc
逆境不可逃15 小时前
【从零入门23种设计模式15】行为型之解释器模式
设计模式·解释器模式