单例模式:一个类只能有一个实例(只能创建出一个对象),为了节省内存资源
怎么保证只有一个实例?
我们知道,当创建一个新对象时,我们会调用类的构造方法,创建多个对象,那我们就会调用多次构造方法,现在我们要保证只有一个实例,也就是说我们不管创建多少个对象,都只调用一次构造方法,那么怎么实现呢?我们可以给构造方法加上private修饰符,这样构造方法就只能被本类访问了,其他地方你要创建类对象,要访问构造方法就会被拒绝,但是这样的话在其他类要创建对象时就不能使用当前类对象了,所以为了解决这个问题,可以对外提供一个公共方法返回一个对象。
总结一下就是:
-
构造方法私有化
-
对外提供一个公共方法返回一个对象
代码实现:
/**
* @author PgRightWu
* @version 1.0
* @date 2020/12/8 16:42
* @description 单例模式
*/
/*
* 单例模式步骤
* 1.构造方法私有化
* 2.对外提供公共方法返回一个对象
* */
public class Singleton {
// 1.构造私有化
private Singleton(){}
// 饿汉式(一开始就创建)
private static Singleton s = new Singleton();
// 2.对外提供私有方法保证返回一个对象(因为外部调用类的方法要实例化对象,所以用static修饰,可以通过类名调用)
public static Singleton getSingleton(){
return s;
}
}
class TestSingleton{
public static void main(String[] args) {
Singleton s1 = Singleton.getSingleton();
Singleton s2 = Singleton.getSingleton();
Singleton s3 = Singleton.getSingleton();
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
}
}
这样的话,不管创建多少个Singleton对象,都是指向同一个内存地址,也就是只有一个实例
运行效果:
采用懒汉式实现单例模式,其实也很简单,懒汉式就是什么时候用就什么时候创建对象
实现代码:
public class Singleton {
// 1.构造私有化
private Singleton(){}
// 懒汉式(什么时候用什么时候创建)
private static Singleton s;
// 2.对外提供私有方法保证返回一个对象(因为外部调用类的方法要实例化对象,所以用static修饰,可以通过类名调用)
public static Singleton getSingleton(){
if(s==null)
s = new Singleton();
return s;
}
}
现在我们来聊一聊单例模式饿汉式与懒汉式的区别
- 饿汉式是在类加载时就进行实例化,而懒汉式默认不会实例化,是什么时候new什么时候才实例化
- 饿汉式是线程安全的,因为在类加载时对象就已经实例化了,而懒汉式不是线程安全的,是什么时候用就什么时候实例化,这样当多个线程同时需要实例化某个对象时,访问实例化代码,就会生成多个对象,所以是线程不安全的(可以通过同步锁解决)。
- 饿汉式是在类加载时实例化对象,所以会占用内存空间,造成内存空间的浪费,而懒汉式是什么时候用什么时候实例化对象,相对不会造成内存浪费。