单例模式是Java设计中常用的模式之一,它确保一个类只有一个实例,并提供一个全局访问点。然而,传统的单例模式通常不支持在创建实例时传递参数。本文将介绍如何通过几种不同的方法实现带参数的单例模式,以实现实例的定制化。
一、饿汉式单例模式
饿汉式单例模式是在类加载时就立即初始化单例对象,并可以通过构造函数传递参数。
public class Singleton {
private static Singleton instance;
private String param;
private Singleton(String param) {
this.param = param;
}
public static Singleton getInstance(String param) {
if (instance == null) {
instance = new Singleton(param);
}
return instance;
}
public String getParam() {
return param;
}
}
优点:
- 简单易实现。
- 在类加载时就完成实例化,保证了实例的唯一性。
缺点:
- 如果实例化过程复杂,会降低程序启动速度。
- 无法在运行时传递参数。
二、懒汉式单例模式
懒汉式单例模式是在第一次使用时才创建实例,并通过构造函数传递参数。
public class Singleton {
private static Singleton instance;
private String param;
private Singleton(String param) {
this.param = param;
}
public static synchronized Singleton getInstance(String param) {
if (instance == null) {
instance = new Singleton(param);
}
return instance;
}
public String getParam() {
return param;
}
}
优点:
- 在需要时才创建实例,降低了程序启动速度。
- 可以在运行时传递参数。
缺点:
- 使用了
synchronized关键字,可能会降低性能。 - 如果在多线程环境下,可能会有多个实例被创建。
三、双重校验锁单例模式
双重校验锁单例模式结合了懒汉式和饿汉式的优点,确保了线程安全,并且可以在运行时传递参数。
public class Singleton {
private static volatile Singleton instance;
private String param;
private Singleton(String param) {
this.param = param;
}
public static Singleton getInstance(String param) {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton(param);
}
}
}
return instance;
}
public String getParam() {
return param;
}
}
优点:
- 线程安全。
- 在需要时才创建实例,降低了程序启动速度。
- 可以在运行时传递参数。
缺点:
- 代码复杂度较高。
四、静态内部类单例模式
静态内部类单例模式利用了类加载机制,保证了实例的唯一性和线程安全,同时支持在运行时传递参数。
public class Singleton {
private String param;
private Singleton(String param) {
this.param = param;
}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton("initial value");
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
public String getParam() {
return param;
}
}
优点:
- 线程安全。
- 简单易实现。
- 支持在运行时传递参数。
缺点:
- 代码复杂度较高。
总结
本文介绍了四种实现Java单例模式传参的方法,包括饿汉式、懒汉式、双重校验锁和静态内部类单例模式。每种方法都有其优缺点,在实际应用中应根据具体需求选择合适的方法。
