设计模式:单例设计模式

什么是单例设计模式

单例模式是一种创建唯一对象的设计模式,保证一个类只有一个实例对象。
单例设计模式往往可以满足以下需求:

  1. 需要频繁实例化对象然后销毁
  2. 需要创建一个方便数据传输(通信)的环境
  3. 只需要一个实例,并且不允许存在多个实例
  4. 实例化对象资源消耗过多,反复创建成本高

实现步骤

  1. 构造函数私有化,使得无法在外部构造对象
  2. 类中定义一个静态指针,它指向一个对象,这个对象只创建一次
  3. 提供一个静态接口,其返回上面的静态指针,也就是唯一对象

简单实现代码即解析

第一种实现方式

头文件

#pragma once
#include<iostream>
using namespace std;
class Single
{
public:
	//公有全局接口
	static Single* GetInstance();

	//唯一实例指针,当然可以放在private下更安全些,第二种实现就放在了private下。
	static Single* pintance;

	//测试接口
	void test();
private:
	//构造函数私有化
	Single();
};

实现文件

#include "Single.h"

//上来先初始化指针
Single* Single::pintance = nullptr;

Single::Single() {
    cout << "Creating Single Instance" << endl;
    //下面这行初始化与否都无所谓,因为必然初始化过了
    pintance = nullptr;
}

Single* Single::GetInstance(){
    if (pintance == nullptr) {
        //在这里实例化唯一对象
        pintance = new Single;
    }
    return pintance;
}

void Single::test(){
    cout << "success!" << endl;
}

源文件调用形式

#include"Single.h"
using namespace std;

int main() {
	Single* p1 = Single::GetInstance();
	Single* p2 = Single::GetInstance();
	//两者地址应当相同,因为只存在一个实例。
	//并且只调用了一次构造函数
	cout << hex << p1 << "\n" << hex << p2 << endl;
	p1->test();
	return 0;
}

结果如下:
第一种实例化

第二种实现方式

头文件

#pragma once
#include<iostream>
using namespace std;
class Single2
{
public:
	//公有全局接口
	static Single2* GetInstance();

	//测试接口
	void test2();
private:
	//构造函数私有化
	Single2();

	//唯一实例指针
	static Single2* pintance;
};

实现文件

#include "Single2.h"
//这里与第一种不同之处在于,无论是否使用对象,对象都会被创建
//比如游戏资源加载,这些必不可少的资源在启动时就自己加载省却调用
//怕麻烦的推荐使用这种方法,毕竟很少有人会包含某个类,但不去使用
Single2* Single2::pintance = new Single2;
Single2* Single2::GetInstance(){
    return pintance;
}
void Single2::test2()
{
    cout << "success!" << endl;
}
Single2::Single2() { }

源文件调用形式

#include"Single2.h"
using namespace std;

int main() {
	Single2* p1 = Single2::GetInstance();
	Single2* p2 = Single2::GetInstance();
	//两者地址应当相同,因为只存在一个实例。
	//并且只调用了一次构造函数
	cout << hex << p1 << "\n" << hex << p2 << endl;
	p1->test2();
	return 0;
}

如果如下:
第二种调用

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值