单例模式(Singleton)
定义:
指一个类只有一个实例,且该类能自行创建这个实例的一种模式。
单例模式的例子:
任务管理器、Windows 的回收站、操作系统中的文件系统、多线程中的线程池、显卡的驱动程序对象、打印机的后台处理服务、应用程序的日志对象、数据库的连接池、网站的计数器、Web 应用的配置对象、应用程序中的对话框、系统中的缓存等
单例模式的特点:
1.单例类只有一个实例对象;
2.该单例对象必须由单例类自行创建;
3.单例类对外提供一个访问该单例的全局访问点。
实现方法:
构造方法私有化
实现种类:
懒汉式和饿汉式,懒汉式是访问类需要获取实例时才创建实例。饿汉式是单例类初始化时就创建实例对象。
//懒汉式
public class LazySingleton
{
private static volatile LazySingleton instance=null; //保证 instance 在所有线程中同步
private LazySingleton(){} //private 避免类在外部被实例化
public static synchronized LazySingleton getInstance()
{
//getInstance 方法前加同步
if(instance==null)
{
instance=new LazySingleton();
}
return instance;
}
}
如果编写的是多线程程序,需要加上volatile和synchronized,但同时也会消化一定的性能。
—————————————————————————————————————————————————————
//饿汉式
public class HungrySingleton
{
private static final HungrySingleton instance=new HungrySingleton();
private HungrySingleton(){}
public static HungrySingleton getInstance()
{
return instance;
}
}
单例模式与多例模式的选择:
之所以用单例,是因为没必要每个请求都新建一个对象,这样子既浪费CPU又浪费内存;
之所以用多例,是为了防止并发问题;即一个请求改变了对象的状态,此时对象又处理另一个请求,而之前请求对对象状态的改变导致了对象对另一个请求做了错误的处理;如struts的action必须为多例模式,因为每次请求的参数都不一样。
拓展:有限多例模式
有限多例模式和单例模式有些类似,但是单例的是一个实例的数组,当要获取实例的时候就从单例数组中随机取一个。‘