预计阅读时间:8 分钟
1、单例模式的定义
保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式结构图如下所示:
Singleton:负责创建Singleton类自己的唯一实例,并提供一个getInstance的方法,让外部来访问这个类的唯一实例
在Java中,单例模式的实现又分为两种,一种称为懒汉式,一种称为饿汉式,其实就是在具体创建对象实例的处理上,有不同的实现方式。
-
懒汉式单例实现的示例
public class Singleton {
// 定义一个变量来存储创建好的类实例
private volatile static Singleton uniqueInstance = null;
// 私有化构造方法,好在内部控制创建实例的数目
private Singleton(){}
// 提供一个全局访问点,为客户端提供类实例
public static synchronized Singleton getInstance(){
if(uniqueInstance == null) {
synchronized(Singleton.class) {
if(uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
//如果有值,那就直接使用
return uniqueInstance;
}
// 示意方法,单例可以有自己的操作
public void singletonOperation(){
//功能处理
}
// 示意属性,单例可以有自己的属性
private String singletonData;
// 示意方法,让外部通过这些方法来访问属性的值
public String getSingletonData(){
return singletonData;
}
}
-
饿汉式单例实现的示例
public class Singleton {
private static Singleton uniqueInstance = new Singleton();
// 私有化构造方法,好在内部控制创建实例的数目
private Singleton(){}
// 提供一个全局访问点,为客户端提供类实例
public static Singleton getInstance(){
return uniqueInstance;
}
// 示意方法,单例可以有自己的操作
public void singletonOperation(){
//功能处理
}
// 示意属性,单例可以有自己的属性
private String singletonData;
// 示意方法,让外部通过这些方法来访问属性的值
public String getSingletonData(){
return singletonData;
}
}
2、案例分析
(1)需求描述:读取应用的配置文件
(2)采用单例模式实现(饿汉式)
public class AppConfig {
private static AppConfig instance = new AppConfig();
public static AppConfig getInstance(){
return instance;
}
// 用来存放配置文件中参数A的值
private String parameterA;
// 用来存放配置文件中参数B的值
private String parameterB;
public String getParameterA() {
return parameterA;
}
public String getParameterB() {
return parameterB;
}
// 私有化构造方法
private AppConfig(){
readConfig();
}
// 读取配置文件,把配置文件中的内容读出来设置到属性上
private void readConfig(){
Properties p = new Properties();
InputStream in = null;
try {
in = AppConfig.class.getResourceAsStream("AppConfig.properties");
p.load(in);
// 把配置文件中的内容读出来设置到属性上
this.parameterA = p.getProperty("paramA");
this.parameterB = p.getProperty("paramB");
} catch (IOException e) {
System.out.println("装载配置文件出错了,具体堆栈信息如下:");
e.printStackTrace();
}finally{
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
//创建读取应用配置的对象
AppConfig config = AppConfig.getInstance();
String paramA = config.getParameterA();
String paramB = config.getParameterB();
System.out.println("paramA="+paramA+",paramB="+paramB);
}
}
尾注
- 上述的总结与思考是基于对《研磨设计模式》这本书的精读与演绎
- 更多及时干货,请关注微信公众号:JAVA万维猿圈