单例模式


在这里插入图片描述

1、场景举例

日志系统

2、主要应用场景

1、解决重复操作引起的大量new delete问题
2、代替全局变量

3、类图

在这里插入图片描述

4、用C语言实现原型模式

角色定义

1、实现一个返回静态地址的内存申请函数

案例描述

使用单例模式实现申请具体结构内存,下次调用申请函数时,如果内存已被申请,则直接返回地址

案例实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct DATA{  
    char data[12];  
}Data;  

struct DATA* get_data()  
{  
    static Data* data = NULL;  
      
    if(NULL != data){  
        printf("I have being...\n");
        return data; 
    }        
  
    data = (DATA*)malloc(sizeof(Data)); 
    if (data == NULL){
        return NULL;
    }
    printf("new malloc\n");
 
    return data;  
}

int main()
{
    struct DATA* data = NULL;
    
    data = get_data();
    data = get_data();
    data = get_data();
    
    if (data != NULL) {
        free(data);
    }   
    
    return 0;
}

5、使用C++实现单例模式

角色定义

1、定义一个单例类
注意私有变量函数指针为静态,且需要初始化。

案例描述

实现一个单例类,内存如果被申请则不进行重复申请

函数实现

#include <iostream>

using namespace std;

class Singleton {
public:
	static Singleton* GetInstance()
	{
		if (m_instance == NULL) {
			m_instance = new Singleton();
		}
		return m_instance;
	}

	static void DestoryInstance()
	{
		if (m_instance == NULL)
		{
			delete m_instance;
			m_instance = NULL;
		}
	}

	int get_value() 
	{
		return m_test;
	}

private:
	Singleton() { m_test = 10; };
	static Singleton* m_instance;
	int m_test;
};

Singleton*  Singleton::m_instance = NULL;

int main()
{
	Singleton* singleton = Singleton::GetInstance();
	cout << singleton->get_value() << endl;
	Singleton::DestoryInstance();

	return 0;
}

6、缺点

1、多进程、多线程场景,需要注意加锁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值