什么是单例模式
单例模式是一种对象创建模式,用于生产一个对象的实例,它可以确保系统中一个类只产生一个实例,这样做有两个好处:
1.对于频繁使用的对象,可以省略创建对象所花费的时间,这对于那些重量级对象而言,是非常可观的一笔系统开销。
2.由于new操作的次数减少,所以系统内存的使用评率也会降低,这将减少GC压力,缩短GC停顿时间。
由于以上两点可知单例模式的使用对于系统的关键组件和频繁使用的对象来说是可以有效的改善系统的性能的。
上述摘自博客园,这是对单例模式很学术,很专业的解释。但是具体而言,在qt编程中,单例模式什么时候用呢?怎么用?作为一个初学者,我分享一点自己的拙见。
啥时候用
试想这样一种情况,你要为一个机器人写一个处理食材的函数,洗菜啊,洗水果啊,削皮啊等等,你需要写很多类,完成一个个功能。但是,所有的食材最后都需要切片装盘,你总不能一个食材写一个切片类吧。你如果只写一个切片类,那对于你的程序而言,每个食材都需要创建此类的一个实例,每创建一个实例就new一次,这显然是不合理的。更严重的情况,这样做会大幅增加程序崩溃的可能。
这时候单例模式就能派上用场了。一个单例模式的类,在你的程序中永远只有一个实例,这个实例由该类自己创建,并提供给其他类使用。总而言之,只new一次。
怎么用
废话不多说,直接上代码。
fileclient是我想构造成单例模式的类,别的代码都删去了,只留下了和单例有关的。
先说构造函数(包括析构),其实严谨一点应该定义为private,因为这个类应该只能自己实例化自己,但是只要别的类不调用这个构造函数,影响不大。建议还是放在private,毕竟这是最严谨的,也能让你的同事一目了然这个类不能另外构造。
get_ins和interface,两个静态,配合起来用来实例化类。
class FileClient
{
Q_OBJECT
public:
explicit FileClient();
~FileClient();
static FileClient *get_ins();
static FileClient *interface;
}
在get_ins函数体内,把interface实例化了,这是程序里fileclient类唯一new的地方。
FileClient * FileClient::interface = nullptr;
FileClient *FileClient::get_ins()
{
if(interface == nullptr) {
interface = new FileClient();
}
return interface;
}
在别的类里引用该单例,在头文件定义类指针
FileClient *client;
在源文件你的初始化代码段里添加下述代码调用get_ins实例化类指针
client = FileClient::get_ins();
OK,你可以快乐的使用单例了。