单例设计模式:保证一个类仅有一个实例,并提供一个全局访问点。
特点:
- 构造方法私有化;
- 声明一个本类对象;
- 给外部提供一个静态方法获取对象实例;
一、实现方式:
1、饿汉式:在类被加载后,对象被创建,到程序结束后释放;
//恶汉式:占用内存时间长,效率高
class Singleton1{
private Singleton1(){}
private static Singleton1 s = new Singleton1();
public static Singleton1 getInstance() {
return s;
}
public void print() {
System.out.println("singleton1");
}
}
2、懒汉式:在第一次调用getInstance()方法时,对象被创建,到程序结束后释放;
//懒汉式:占用内存时间相对较短,效率较低(懒加载,延迟加载)
//多线程访问时可能会有安全性问题
class Singleton2{
private Singleton2(){}
private static Singleton2 s;
public static Singleton2 getInstance() {
if (s == null) {
s = new Singleton2();
}
return s;
}
public void print() {
System.out.println("Singleton2");
}
}
能不能使用构造方法私有化+静态方法来替代单例呢?比如Math工具类
因为静态方法在类加载的时候就会一直占用内存,但是单例模式会涉及栈内存的使用,占用内存相对较小。
二、有什么好处?
- 在设计一些工具类的时候(通常工具类,只有功能方法,没有属性);
- 工具类被频繁调用;
目的时为了节省重复创建对象所带来的内存消耗,来提高效率。