单例模式实现的两种方式
一:饿汉式
class Singleton {
// 1.私有化构造器
private Singleton() {
}
// 2.内部提供一个当前类的实例
// 4.此实例也必须静态化
private static Singleton single = new Singleton();
// 3.提供公共的静态的方法,返回当前类的对象
public static Singleton getInstance() {
return single;
}
}
二:懒汉式
class Singleton {
// 1.私有化构造器
private Singleton() {
}
// 2.内部提供一个当前类的实例
// 4.此实例也必须静态化
private static Singleton single;
// 3.提供公共的静态的方法,返回当前类的对象
public static Singleton getInstance() {
if(single == null) {
single = new Singleton();
}
return single;
}
}
饿汉式VS懒汉式
饿汉式:
- 特点:立即加载,即在使用类的时候已经将对象创建完毕。
- 优点:实现起来简单;没有多线程安全问题。
- 缺点:当类被加载的时候,会初始化 static 的实例,静态变量被创建并分配内存空间,从这以后,这个 static 的实例便一直占着这块内存,直到类被卸载时,静态变量被摧毁,并释放所占有的内存。因此在某些特定条件下会耗费内存。
懒汉式:
- 特点:延迟加载,即在调用静态方法时实例才被创建。
- 优点:实现起来比较简单;当类被加载的时候,static 的实例未被创建并分配内存空间,当静态方法第一次被调用时,初始化实例变量,并分配内存,因此在某些特定条件下会节约内存。
- 缺点:在多线程环境中,这种实现方法是完全错误的,线程不安全,根本不能保证单例的唯一性。
单例模式的优点及应用场景
优点
由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比
较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时
直接产生一个单例对象,然后永久驻留内存的方式来解决。举例:
应用场景
- Windows 的 Task Manager (任务管理器)就是很典型的单例模式
- Windows 的 Recycle Bin (回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。
- Application 也是单例的典型应用
- 应用程序的日志应用,一般都使用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。
- 数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。
声明:若发现资源失效或错误可在文章顶部“评论建议”留言,我们将尽快处理!本站绝大部分资源都来自互联网,原作者信息已无从考究。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。