单例模式
认识单例模式之前先认识一下几种常见的特殊类的设计。
特殊类的设计
-
设计一个类 只能再堆上创建对象
-
只能再堆上创建,则通过new来创建对象。
- 将类的构造函数设为私有,以防止外部直接创建对象。
- 提供一个静态成员函数,用于在堆上创建对象,并返回指向该对象的指针
- 在类的析构函数中释放对象的内存,以确保对象在不再需要时被正确销毁。
class HeapOnly { public: // 获取堆上对象的静态成员函数 static HeapOnly* CreateObj() { return new HeapOnly(); } // 删除拷贝构造函数和赋值运算符,以确保只能通过 create() 创建对象 HeapOnly(const HeapOnly&) = delete; HeapOnly& operator=(const HeapOnly&) = delete; private: // 将构造函数设为私有,以防止外部直接创建对象 HeapOnly() { // 可以在这里进行初始化操作 } // 在析构函数中释放对象的内存 ~HeapOnly() { // 可以在这里进行资源释放操作 } };
-
HeapOnly
类的构造函数是私有的,外部无法直接调用。 -
向外提供的
CreateObj
方法必须定义为static成员函数。因为外部调用该接口就是为了获取对象的,而非静态成员函数必须通过对象才能调用,静态成员函数直接使用类名::函数名
即可调用。 -
将拷贝构造函数和赋值运算符重载函数之间禁用,也可以设置为私有属性,以防通过拷贝和赋值创建对象。
-
使用示例:
int main() { // 创建堆上的对象 HeapOnly* obj = HeapOnly::create(); // 使用对象... // 删除对象 delete obj; return 0; }
-
-
设计一个类 只能再栈上创建对象
-
只能再栈上创建对象,说明不能通过new创建对象,也不能定义为static对象。创建方式如下:
- 将类的构造函数设为私有,防止外部直接调用构造函数在堆上创建对象。
- 在类中定义一个静态成员函数,用于创建对象,并返回该对象的引用或指针。
class StackOnly { public: // 获取栈上对象的静态成员函数 static StackOnly& create() { // 在静态成员函数中
-