@@@模式定義:
保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。
@@@練習示例:
讀取配置文件的內容。
@@@示例代碼:
src/tools/AppConfig.java
~~~~~~~~~~~~~~~~~~~~~~~~
package tools;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
*
* 讀取應用配置文件
*/
public class AppConfig {
/**
* 定義一個變量來存儲創建好的類實例,直接在這裏創建類實例,只能創建一次
*/
private static AppConfig instance = new AppConfig();
/**
* 定義一個方法來爲客戶端提供AppConfig類的實例
* @return 一個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();
}
}
}
}
src/tools/AppConfig.properties
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
paramA=a
paramB=b
src/user/Client.java
~~~~~~~~~~~~~~~~~~~~
package user;
import tools.AppConfig;
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);
}
}
@@@模式的實現:
1. 餓漢式,空間換時間,線程安全。
2. 懶漢式,時間換空間,不加同步則線程不安全。
3. 用枚舉實現。
@@@模式的本質:
控制實例數目,節省系統資源。