定义
单例模式是一种常见的设计模式。核心结构是含有一个被称为单例的特殊类,即系统中一个类只能有一个实例对象。
特点
- 单例类只能有一个实例
- 单例类必须自己创建唯一实例
- 单例类必须提供其他引用它的对象实例
要点
- 私有的构造方法
- 指向自己实例的私有静态引用
- 以自己实例为返回值的静态的公有方法
其中单例模式分为饿汉单例模式和懒汉单例模式
饿汉单例指在类加载时就生成一个类的实例
懒汉单例指在调用获取类实例的方法时才生成类的实例
代码
饿汉单例
public class Singleton {
//饿汉单例
private static Singleton singleton1 = new Singleton();
private Singleton(){}
public static Singleton getInstance1(){
return singleton1;
}
}
懒汉单例
public class Singleton {
//懒汉单例
private static Singleton singleton2;
private Singleton(){}
public static synchronized Singleton getInstance2(){
if(singleton2 == null)
singleton2 = new Singleton();
return singleton2;
}
}
懒汉模式–双重锁
public class Singleton {
//双重锁
private static Singleton singleton;
private Singleton(){}
public static Singleton getInstance(){
if(singleton == null){
synchronized(Singleton.class){
if(singleton == null)
singleton = new Singleton();
}
}
return singleton;
}
}
推荐使用懒汉加载–双重锁模式,这样可以不必每次都同步方法,减少了性能的消耗。
优点
- 单例模式只有一个对象,节省空间
- 避免频繁的创建销毁对象,提高性能
- 可以全局访问,避免对共享资源的多重占用
缺点
4. 扩展困难,修改的话必须重写单例类
5. 隐式结果引起类结构不清晰
6. 导致内存泄漏
注意事项
- 只能使用单例类提供的方法得到对象,不要通过反射得到对象,否则会产生一个新的实例
- 多线程共享资源时注意线程安全