Skip to main content

单例设计模式

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外接访问,从而方便对实例个数的控制并节约系统资源。如果希望系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

让类不能再外部实例化

单例设计模式第一个重点就是让这个类不能被多次实例化,具体的解决方法就是将构造函数私有化,这样就不会在外部再实例化这个类了。

private:
// 1、防止该类在外界实例化对象,构造函数私有化
Singleton() {}
Singleton(const Singleton &ob) {}
~Singleton() {}

但是呢,如果这样做了,那么在外部就不能再实例化这个类了,那么怎么才能实例化呢?这就需要在类的内部实例化一个对象,然后提供一个公共的方法来获取这个对象。

使用静态成员变量

具体的做法就是使用一个静态的指针变量来保存这个实例的唯一地址,然后在类的内部实例化这个对象,然后提供一个公共的方法来获取这个对象。

private:
// 2、定义个静态的指针变量保存唯一实例的地址
static Singleton * const p;
public:
// 3、获得唯一的实例地址
static Singlegon *getSingleton(void)
{
return p;
}

在调用这个方法之前我们需要给这种指针分配空间,在类外写如下的语句:

Singleton * const Singleton::p = new Singleton();

设计具体任务函数

最后一步就是设计具体的任务函数,这个函数就是我们要实现的功能,比如说我们要实现一个计算器,那么这个函数就是计算器的功能,比如说加减乘除等等。

public:
// 4、用户定义的,任务函数
void task(string a)
{
// 具体的任务实现细节
cout << "task: " << a << endl;
}

总体代码

#include <iostream>

using namespace std;

class Singleton
{
private:
// 1、防止该类在外界实例化对象,构造函数私有化
Singleton() {}
Singleton(const Singleton &ob) {}
~Singleton() {}
private:
// 2、定义个静态的指针变量保存唯一实例的地址
static Singleton * const p;
public:
// 3、获得唯一的实例地址
static Singlegon *getSingleton(void)
{
return p;
}
// 4、用户定义的,任务函数
void task(string a)
{
// 具体的任务实现细节
cout << "task: " << a << endl;
}
};

Singleton *const Singleton::p = new Singleton();

int main()
{
// 获取单例的地址
Singleton *p1 = Singleton::getSingleton();
p1->task("A");
p1->task("B");
p1->task("C");

Singleton *p2 = Singleton::getSingleton();
p2->task("D");
p2->task("E");
p2->task("F");
return 0;
}