初步了解单例模式(代码)
//单例,要检查你是否实例化对象(单线程)
// 1-》如果已实例化对象,无需在实例化对象,只需返回原本的实例对象
//2-》如果没实例化对象,就实例化对象,拿到实例对象
#include<iostream>
using namespace std;
class Singleton {
//构造方法私有,防止其他方法实例化本类的对象,
// 只有本类的方法可以实例化对象,因为只有这样才可以访问本类私有的方法。
private:
static Singleton* instance;//指针--作用--只是声明,并没有创造;
Singleton() {
}
public:
//1->作用实例化一个对象,并放回
//
//
//2->因为在main函数中,无法实例化对象,
// 只能调用Singleton getInstance()方法,才能拿到对象,所以是静态的
static Singleton getInstance() {
if (instance == nullptr)
instance = new Singleton();
/*Singleton s1;
return s1;*/
return * instance;//静态方法只能访问静态属性,所以* instance一定是静态的
}
};
Singleton* Singleton::instance = nullptr;
int main()
{
Singleton::getInstance();
}
1. 什么是单例模式
单例模式是指在整个系统生命周期内,保证一个类只能产生一个实例,确保该类的唯一性。
2.单例模式有三个关键点
- 唯一性:确保只有一个实例被创建。
- 全局访问:提供一个全局访问点来访问该实例。
- 延迟加载:可以实现延迟加载,即在第一次使用时才创建实例对象,从而节省资源。
3.单例模式的优缺点
单例模式的优点包括但不限于:
- 节约系统资源,避免重复创建对象。
- 提供全局访问点,便于管理。
- 可以控制实例的生命周期,确保资源被正确释放。
单例模式的缺点主要包括:
- 可能违反“单一职责原则”,因为单例类既要负责自身的功能,又要负责管理实例的生命周期。
- 可能难以扩展,因为单例类的实例被固定。
- 在多线程环境下,如果没有正确的线程安全措施,可能会引发安全问题。
4.单例模式的实现方式
单例模式的实现方式主要有以下几种:
- 饿汉式:在类加载时就完成了实例化,这种方式简单但可能造成资源浪费。
- 懒汉式:在第一次使用时才进行实例化,可以实现延迟加载,但在多线程环境下可能需要额外的线程安全措施。
- 双重检查锁定(DCL):通过两次检查实例是否存在的机制来确保单例的创建。
- 静态内部类:利用静态内部类的方式来实现单例模式,可以做到线程安全和延迟加载。
- 枚举:使用枚举类型来实现单例,这是 Java 5 之后推荐的实现方式,因为它更简洁、更安全、更优雅。
5.适用场景
单例模式的典型应用场景包括:
- 全局配置信息的读取和管理。
- 数据库连接池的管理。
- 系统级别的工具类对象。
- 日志记录器。
- 线程池的控制。
综合分析
单例模式是一个非常基础且广泛使用的设计模式,它的核心在于确保类的实例唯一性和全局访问性。实现单例模式时,需要考虑线程安全、延迟加载等问题,并根据不同的应用场景选择合适的实现方式。在使用单例模式的过程中,要注意其潜在的缺点,如可能造成的职责过重和难以扩展,因此在设计时要充分理解单例模式的特点和适用场景,以便更有效地应用于实际开发中。