单例模式
实现单例模式的步骤
- 私有化构造方法
确保外部不能直接通过构造方法来实例化对象,从而限制对象的创建。 - 提供静态方法获取实例
通过一个静态方法来获取单例对象的实例,通常命名为 getInstance()。 - 提供一个静态变量(对于饿汉和懒汉不同)
一、饿汉式单例模式
- 私有化构造方法
确保外部不能直接通过构造方法来实例化对象,从而限制对象的创建。 - 提供静态方法获取实例
通过一个静态方法来获取单例对象的实例,通常命名为 getInstance()。 - 定义一个静态变量
在类加载的时候,初始化静态变量。(只初始化一次)
package com.camellia.singleton1;
/**
* 饿汉单例模式
*/
public class Singleton {
//饿汉式单例模式:类加载时对象就创建好了。不管这个对象用还是不用。提前先把对象创建好。
private static Singleton instance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
}
package com.camellia.singleton1;
public class SingletionTest {
public static void main(String[] args) {
Singleton instance1 = Singleton.getInstance();
Singleton instance2 = Singleton.getInstance();
System.out.println(instance1 == instance2); //比较引用存储的对象地址。
}
}
二、懒汉式单例模式
- 私有化构造方法
确保外部不能直接通过构造方法来实例化对象,从而限制对象的创建。 - 提供静态方法获取实例
通过一个静态方法来获取单例对象的实例,通常命名为 getInstance()。 - 定义一个静态变量
但是这个变量值为null。
package com.camellia.singleton2;
/**
* 懒汉模式
*/
public class Singleton {
private static Singleton instance;
private Singleton(){}
public static Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
package com.camellia.singleton2;
public class SingletonTest {
public static void main(String[] args) {
Singleton instance1 = Singleton.getInstance();
Singleton instance2 = Singleton.getInstance();
System.out.println(instance1 == instance2);
}
}
存在线程安全问题,在instance == null可能会创建多个对象。