1、核心作用:
保证一个类只有一个实例,并且提供一个访问改实例的全局访问点。
2、常见的应用场景:
1、Windows的Task Manager(任务管理器)就是很典型的单例模式
2、Windows的Recycle Bin(回收站)也是典型的单例应用。在整个系统运行过程中,回收战一直维护者仅有的一个实例
3、项目中,读取配置文件的类,一般也只有一个对象,没有必要每次使用配置文件数据,每次new 一个对象去读取
4、网站的技术器,一般也是采用单例模式实现,否则难以同步
5、应用程序的日志应用,一般都用单例模式实现,这一般是由于共享
的日志文件一致处于打开状态,因为只能有一个实例去操作。
否则,内容不好追加
6、数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种
数据库资源。
7、操作系统的文件系统,也是大的单例模式实现的具体例子,一个操作系统
只能由一个文件系统
8、Application 也是单例的典型应用(Servlet编程会涉及到)
9、在Spring中,每个bean 默认就是单例的,这样做的优点是Spring容器可以管理
10、在servlet编程中,每个Servlet 也是单例
11、在Spring MVC框架/struts1框架中,控制器对象也是单例
3、优点
1 、由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,
如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久
驻留内存的方式来解决
2、单例模式在系统设置全局的访问点,优化环共享资源访问,例如可以涉及一个单例类,负责所有数据表的映射处理
4、2个主要的实现
懒汉式: (线程安全,调用效率不高,但是,可以延时加载)
1、构造器私有
2、属性static
package com.bwie;
private SingletonDemo2 (){
}
private static SingletonDemo2 s;
//为了防止多个线程同时调用,需要这样
public static synchronized SingletonDemo2 getInstance(){
if(s==null){
s=new SingletonDemo2();
}
return s;
}
饿汉式:(线程安全,调用效率高,但是,不能延时加载)
package com.bwie;
private static SingletonDmo1 instance=new SingletonDmo1();//类加载,天然线程安全模式
private SingletonDmo1(){
}
public static SingletonDmo1 getInstance(){
return instance;
}
}