单例模式
单例模式定义:定义:确保某个类只有一个实例,而且自行实例化提供给外部使用。
单例模式有很中比较常用的有懒汉模式和饿汉模式。注:我在网上查说的比较多的模式,在项目中比较常看到的有懒汉模式。饿汉模式没怎么看过。
懒汉模式:
public class SingleTon {
//声明私有化
private static SingleTon singleTonInstance;
//将构造函数私有化
private SingleTon() {
}
//懒汉式
private static synchronized SingleTon getInstance(){
if (null==singleTonInstance){
singleTonInstance = new SingleTon();
}
return singleTonInstance;
}
}
优点:用到的时候才会去实例化,在一定程度上节约了资源。
缺点:getInstance方法是用synchronized修饰的,该方法是同步的,为了保证线程安全,但是导致每次调用该方法的时候都会被同步,这样会消耗不必要的资源(不必要的同步开销)。所以这种模式一般不建议使用。。
饿汉模式:
public class SingleTon {
//将构造函数私有化
private SingleTon() {
}
//创建私有实例对象
private static final SingleTon singleTonInstance = new SingleTon();
//对外提供方法,返回实例对象
public static SingleTon getInstance() {
return singleTonInstance;
}
优点:简单,线程安全。
缺点:实例对象是static的,在声明的时候就实例化了,浪费资源。
PS:还有一个双重锁定模式就是在懒汉模式添加一层synchronized。实例控制:Singln 会阻止其他对象实例化其自己的 Singln 对象的副本,从而确保所有对象都访问唯一实例
灵活性:因为类控制了实例化过程,所以类可以更加灵活修改实例化过程
总结
在单例模式中构造方法必须写的,而且构造方法必须去私有化。因为单例模式只会去实例化一次,不写构造方法在java中会默认生成一个共有的构造方法。那样的话就不是单例模式了。在构造方法中尽量不要去初始化参数,可以写init方法代替进行初始化。构造方法初始化值会很麻烦(听说的)。饿汉模式使用大多数情况是在多线程的情况下去使用的。
单例模式调用方法:类.getInstance().方法。