单例模式
- 单例类和实用类:
实用类通常也会采用私有化的构造方法来避免其有实例,如Math。- 实用类不保存状态,仅提供一些静态方法或静态属性让你使用,而单例类是有状态的。
- 实用类不能用于继承多态,而单例虽然实例唯一,却是可以有子类来继承
- 实用类只不过是一些方法属性的集合,而单例却是有着唯一的对象实例。
结构图
代码
Singleton 类,定义一个Getinstance操作,允许客户访问它的唯一实例。Getinstance是一个静态方法,主要负责创建自己的唯一实例。
唯一实例可以定义为:
- 类的静态变量:需要注意初始化,如果在初始化之前使用会有未定义的行为。
- Getinstance函数中的局部静态变量,基本没啥问题 除了多线程访问。
class Singleton
{
private:
static Singleton *instance;
Singleton(){};
public:
static Singleton *getInstance()
{
if (NULL == instance)
instance = new Singleton();
return instance;
}
};
// 注意初始化 否则会出现未定义的行为
Singleton *Singleton::instance = nullptr;
int main()
{
Singleton *s1 = Singleton::getInstance();
Singleton *s2 = Singleton::getInstance();
if (s1 == s2)
{
cout << "the same instance." << endl;
}
return 0;
}