学习笔记:单例模式
模式简介
:属于创建型模式,提供了一种创建对象的最佳方式
为什么用
:有些对象只要一个就行了,不需要也不能有多个对象~
怎么样用
:该对象的申请方式私有,只提供一个访问点,访问它仅有的一个实例。
注意事项
:多线程操作安全问题。简单的方式就提前实例化好,c++ static关键字保证实例只被初始化和定义一次
实际举例
:比如说之前抽象工厂模式的攻击工厂的管理者,可以写成单例模式,毕竟程序只要一个管理者实例就够了。代码过多,下面提供游戏工具的代码实现。
#include <iostream>
#include <ctime>
#include <string>
using namespace std;
//游戏工具
class Tool {
private:
//构造私有
Tool() {}
public:
//禁用复制构造函数和赋值构造函数
Tool(Tool& T) = delete;
Tool& operator=(const Tool& T) = delete;
//静态的访问实例函数,通过类名使用
static Tool& getInstance() {
static Tool t;//静态只被初始化和定义一次
return t;
}
public:
//获取当地时间
string getTime() {
string str;//存储时间
tm t; //tm结构指针
time_t now; //声明time_t类型变量
time(&now); //获取系统日期
localtime_s(&t, &now); //获取当地日期
str.append(to_string(t.tm_year + 1900)); str.append("/");
if ((t.tm_mon + 1) < 10) { //不足10补0
str.append("0");
}
str.append(to_string(t.tm_mon + 1)); str.append("/");
if (t.tm_mday < 10) {
str.append("0");
}
str.append(to_string(t.tm_mday)); str.append(" ");
if (t.tm_hour < 10) {
str.append("0");
}
str.append(to_string(t.tm_hour)); str.append(":");
if (t.tm_min < 10) {
str.append("0");
}
str.append(to_string(t.tm_min)); str.append(":");
if (t.tm_sec < 10) {
str.append("0");
}
str.append(to_string(t.tm_sec));
return str;
}
};
int main()
{
Tool& tool = Tool::getInstance();
cout<<"当前游戏时间:"<<tool.getTime()<<"\n";
return 0;
}