饿汉式单例模式:(2018-3-19 17:22)
1.0 单例模式的定义:
定义:一个类有且仅有一个实例,并且自行实例化向整个系统提供。
1.1 代码场景:
A、package内有AppConfig.properties文件。
B、通过获取单例的AppConfigWithEagerSinglethon对象来读取AppConfig.properties的ParamA和ParamB的值。
1.2 代码获取:点击下载(下载后,直接解压,将文件放入Eclipse/IntelliJ IDEA的src下,建议使用电脑浏览器下载)
1.3代码解读:
1.3.1 AppConfig.properties文件
AppConfig.properties包含两个参数parameterA,parameterB,代码如下:
parameterA=A
parameterB=B
1.3.2 AppConfigWithEagerSingleton.java文件
该文件用于获取单例的AppConfigWithEagerSingleton对象,
具体的步骤如下(重点)
:
a、
创建一个static的AppConfigWithEagerSingleton对象,并且实例化。
b、
私有化构造器
,以确保外界无法随意创建AppConfigWithEagerSingleton对象。
c、
提供一个static方法getInstance()
给用户获取a步骤中已经创建的单例AppConfigWithEagerSingleton对象
除此之外,AppConfigWithEagerSingleton.java文件内还提供readConfig()方法来读取加载并读取AppConfig.properties.。该方法在构造器中被调用。
AppConfigWithEagerSingleton.java代码如下:
package singlethon_eager;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* 读取应用配置文件(使用饿汉式单例模式)
* @author YJ
*/
public class AppConfigWithEagerSingleton {
/**饿汉式单例模式要点一:static+直接创建实例*/
private static AppConfigWithEagerSingleton appConfigWithEagerSingleton=new AppConfigWithEagerSingleton();
/**参数A*/
private String parameterA;
/**参数B*/
private String parameterB;
/**饿汉式单例模式要点二:私有化构造器*/
private AppConfigWithEagerSingleton() {
//读取配置文件
readConfig();
}
/**饿汉式单例模式要点三:提供一个static方法直接获取单例*/
public static AppConfigWithEagerSingleton getInstance(){
return appConfigWithEagerSingleton;
}
/**
* 读取配置文件
*/
private void readConfig(){
Properties properties=new Properties();
//加载当前package下的的AppConfig.properties
InputStream is=AppConfigWithEagerSingleton.class.getResourceAsStream("AppConfig.properties");
try {
properties.load(is);
parameterA=properties.getProperty("parameterA");
parameterB=properties.getProperty("parameterB");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {//释放资源
if(is!=null){
try {
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public String getParameterA() {
return parameterA;
}
public String getParameterB() {
return parameterB;
}
}
1.3.3 客户端AppConfigWithEagerSingletonMain.java文件
流程解读:
a、通过获取AppConfigWithEagerSingleton类的getInstance()获取AppConfigWithEagerSingleton对象。
b、通过AppConfigWithEagerSingleton对象获取parameterA、parameterA两个参数的值。
c、打印parameterA、parameterB的值。
代码如下:
package singlethon_eager;
/***
* 读取应用配置文件(使用饿汉式单例模式)客户端
* @author YJ
*/
public class AppConfigWithEagerSingletonMain {
public static void main(String[] args) {
//通过AppConfigWithEagerSingleton的静态方法getInstance()获取单例
AppConfigWithEagerSingleton appConfigWithEagerSingleton=AppConfigWithEagerSingleton.getInstance();
//获取参数A和参数B
String parameterA=appConfigWithEagerSingleton.getParameterA();
String parameterB=appConfigWithEagerSingleton.getParameterB();
//打印参数A和参数B
System.out.println(parameterA);
System.out.println(parameterB);
}
}
1.4 单例模式的思考
1.单例模式的本质:控制实例数目。
2.饿汉式单例模式的顺序图如下: