c++设计模式

单例模式

若有class A,整个程序中保证A类只有一个对象。

1.为了保证只有一个实例,那么就不能让A类随意创建对象,也就不能调用构造函数,那么就需要把构造函数私有化

2.需要私有的静态当前类的指针成员变量

私有:保证无法在类外对成员变量进行操作。

静态:保证类的对向只有一个。

3.需要一个函数GetInstance()来返回单例模式的对象,因为构造函数私有化所以无法在类外构造对象。那么GetInstance()函数就作为静态接口 ,直接通过类名来调用函数。由于静态函数只能调用静态变量,因此A类中的成员变量也需要是静态。由于成员变量是静态的,所以要在类外进行初始化。

4.**对象释放的问题:**由于单例模式只有一个对象,所以占用内存很少,不用专门释放内存,等到程序结束后系统将所有内存回收即可。

懒汉模式

第一次调用获取实例的函数GetInstance()时才创建对象。

cpp 复制代码
//懒汉模式
class SingletonLazy{
private:
	//1.构造函数私有化
    SingletonLazy(){}
    //2.私有的静态当前类的指针成员变量
    static SingletonLazy* pSingleton;
    
public:
	//3.获取对象的静态接口
    static SingletonLazy* GetInstance(){
        if(pSingleton == nullptr){
            pSingleton = new SingletonLazy;
        }
        return pSingleton;
    }
};
SingletonLazy* SingletonLazy::pSingleton = nullptr;

饿汉模式

直接在类外初始化对象时直接创建。在main函数执行之前就已经创建好对象。

cpp 复制代码
//饿汉模式
class SingletonHungry{
private:
    //1.构造函数私有化
    SingletonHungry(){}
    //2.私有的静态当前类的指针成员变量
    static SingletonHungry* pSingleton;

public:
    //3.获取对象的静态接口
    static SingletonHungry* GetInstance(){
        return pSingleton;
    }
};
SingletonHungry* SingletonHungry::pSingleton = new SingletonHungry;

单例模式遇到多线程

1.懒汉模式在GetInstance函数中创建对象,那么如果多线程同时调用GetInstance函数时,那么线程不安全。

2.饿汉模式在main函数执行前就已经创建好了对象,就不会同时对单例对对象进行操作,所以线程安全。

相关推荐
2301_803554521 小时前
socket编程
c++
Wild_Pointer.1 小时前
设计模式实战精讲:全景目录
设计模式·设计规范
麦麦鸡腿堡1 小时前
Java绘图技术
java·开发语言
热爱编程的OP1 小时前
Linux进程池与管道通信详解:从原理到实现
linux·开发语言·c++
武子康8 小时前
Java-171 Neo4j 备份与恢复 + 预热与执行计划实战
java·开发语言·数据库·性能优化·系统架构·nosql·neo4j
晚风吹长发8 小时前
二分查找算法+题目详解
c++·算法·二分查找
怪兽20149 小时前
fastjson在kotlin不使用kotlin-reflect库怎么使用?
android·开发语言·kotlin
ClearLiang9 小时前
Kotlin-协程的挂起与恢复
开发语言·kotlin
彭同学学习日志9 小时前
Kotlin Fragment 按钮跳转报错解决:Unresolved reference ‘floatingActionButton‘
android·开发语言·kotlin
海域云赵从友9 小时前
破解跨境数据传输瓶颈:中国德国高速跨境组网专线与本地化 IP 的协同策略
开发语言·php