单例模式
一、什么是单例模式?
确保对象的唯一性:拿到某个类的对象,始终都是同一对象,即每个对象的引用地址是唯一的
二、引入单例模式
1、如何确保创建的对象的唯一性
我们使用new关键字创建对象的时候,对象的数量数不受限制的,那么将这些对象进行恒等比较的时候,他们的哈希值必定是不相等的
class Test {
public static void main(String[] args) {
Single s1 = new Single();
Single s2 = new Single();
System.out.println(s1 == s2); //false
}
}
class Single{
}
那么如何能防止让外部类不受限制的new当前类的对象呢?我们首先想到的是静态化。这样我们就可以通过类名创建类的对象
class Test2 {
public static void main(String[] args) {
Single s1 = Single.s;
Single s2 = Single.s;
System.out.println(s1 == s2); //true
}
}
class Single{
static Single s = new Single();
}
但是直接通过类名去获取类中创建的静态的本类对象成员变量不安全,是直接对外暴露的,因此我们又选择对构造器的封装
怎么能保证在外类中不能通过 Single.s 直接获取Single类中创建的静态的本类对象的成员变量呢?
私有化
又让外类怎么能拿到呢?
对外提供静态的公共的访问方式
所有就有了我们的单例模式
class Single1 {
public static void main(String[] args) {
Single s1 = Single.setSingle();
Single s2 = Single.setSingle();
System.out.println(s1);
System.out.println(s2);
}
}
class Single{
private Single(){}
private static Single s = new Single();
public static Single setSingle(){
return s;
}
}
2.两种单例模式
而单例模式又分两种:
1、饿汉模式
在类创建的时候就创建了一个静态的类对象供系统使用,代码如下:
class Single1 {
public static void main(String[] args) {
Single s1 = Single.setSingle();
Single s2 = Single.setSingle();
System.out.println(s1);
System.out.println(s2);
}
}
class Single{
private Single(){}
private static Single s = new Single();
public static Single setSingle(){
return s;
}
}
2、懒汉模式
第一次调用该类的静态方法进行初始化对象的时候才创建该类的对象
class Single2 {
public static void main(String[] args) {
Single s1 = Single.setSingle();
Single s2 = Single.setSingle();
System.out.println(s1 == s2); // true
}
}
class Single{
private Single(){}
// 懒汉模式
private static Single s = null;
public static Single setSingle(){
if(s == null){
s = new Single();
}
return s;
}
}
新手才疏学浅,有不对的地方请各位大佬指教。[^1]