【什么是单例模式(By文心一言)】
单例模式是一种常用的软件设计模式,它保证了一个类只有一个实例,并提供一个全局访问点。这种模式通常用于需要对资源或状态进行共享的情况,可以避免创建过多的对象,从而节省系统资源,提高性能。 单例模式的核心要点是确保一个类只有一个实例,并且该实例易于全局访问。为了实现单例模式,通常需要采取一些措施,包括: - 构造函数私有化:将构造函数私有化,防止从类外部创建实例。
- 提供一个全局访问点:提供一个全局访问点,使得外部代码可以通过这个访问点获取单例实例。
- 双重检查锁定:在多线程环境下,需要采取措施确保只有一个线程能够创建实例,这通常通过双重检查锁定来实现。
单例模式的应用场景包括: - 需要对资源或状态进行共享的情况:例如,如果有一个全局的配置对象,可以通过单例模式实现全局访问。
- 需要控制实例创建的情况:例如,如果某个对象的创建成本很高,可以通过单例模式限制该对象的创建数量。
- 需要确保对象唯一性的情况:例如,如果需要将某个对象作为消息代理传递给其他对象,可以通过单例模式确保该对象的唯一性。
需要注意的是,单例模式也有一些潜在的问题和陷阱。例如,单例对象在应用程序启动时就已经创建,如果这个对象没有正确的生命周期管理,可能会导致内存泄漏。此外,在多线程环境下,如果没有采取正确的线程同步措施,可能会导致并发问题。因此,在使用单例模式时需要注意这些问题,并采取相应的措施进行解决。 总结:单例模式只能创建一个实例(不管多少个对象都指向一个实例),不会造成空间上的浪费 【代码示例(自己写的嗷)】 [C++] 纯文本查看 复制代码 #include <iostream>
class Sample {
private:
static Sample *instance;
Sample() {} // 私有构造函数,不能在外部创建对象
public:
static Sample* getInstance()
{
if (instance == nullptr) {
instance = new Sample();
}
return instance;
}
};
Sample* Sample::instance = nullptr; // 静态成员变量初始化,如果内部初始化必须为const,显然不现实
int main()
{
Sample* singleton1 = Sample::getInstance();
Sample* singleton2 = Sample::getInstance();
if (singleton1 == singleton2) {
std::cout << "同一个实例" << std::endl;
} else {
std::cout << "不同的实例" << std::endl;
}
return 0;
} 由于没有重载==运算符,所以比较对象的方式是比较内存位置,而单例模式由于只有一个实例,所以指针指向同一个位置
|