单例模式
目录
前言
因为最近在看OpenHarmony源码的时候会遇到很多设计模式相关的知识,所以写一个系列文章来分享一些关于设计模式的知识。
其中最常用到的就是单例模式。
本文提供了Java和c++两种实现方法,实力有限,如有错误,敬请谅解。
一、应用场景
1.什么是单例模式?
保证整个系统中一个类只有一个对象的实例,实现这种功能的方式就叫单例模式。
2.优点:
- 单例模式在内存中只有一个实例,减少内存开支,特别是一个对象需要频繁地创建销毁或者是这个对象创建需要的资源比较多,而且创建或销毁时性能又无法优化,这时候使用单例模式性能提升就非常明显了。
- 单例模式可以避免对资源的多重占用,例如一个写文件操作,由于只有一个实例存在内存中,避免对同一个资源文件的同时写操作。单例模式还可以在系统设置全局的访问点,优化和共享资源访问。
3.缺点:
不适用于变化的对象,而且单例模式没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
二、实现
大体上有两种实现方式:饿汉跟懒汉两种模式
1.饿汉模式
简介:这种实现方式比较常见,但是容易产生垃圾对象。
是否懒加载:否
是否多线程安全:是
难度:简单
优点:没有加锁,执行效率会变高
缺点:类加载时就初始化,消耗内存多
它基于 classloader 机制避免了多线程的同步问题,不过,instance 在类装载时就实例化,虽然导致类装载的原因有很多种,在单例模式中大多数都是调用 getInstance 方法, 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化 instance 显然没有达到 lazy loading 的效果。
Java 实现方法:
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){
}
public static Singleton getInstance() {
return instance;
}
}
c++实现方法:
default跟delete(别人的写的还可以)
// 饿汉实现 /
//.h头文件
class Singleton
{
public:
// 获取单实例
static Singleton* GetInstance();
static void deleteInstance();
private:
Singleton()= default;
~Singleton()= default;
// 将其拷贝构造和赋值构造成为私有函数, 禁止外部拷贝和赋值
Singleton(const Singleton &signal) = delete;
const Singleton &operator=(const Singleton &signal) = delete;
private:
// 唯一单实例对象指针
static Singleton *g_pSingleton;
};
//.cpp源文件
// 代码一运行就初始化创建实例 ,线程安全
Singleton* Singleton::g_pSingleton = new (std::nothrow