jdbc設計模式之單例模式
阿新 • • 發佈:2019-02-09
單例模式
作為一種常見的設計模式,單例模式的設計概念是"兩個私有,一個公有",即私有屬性/成員變數和私有構造,以及公有方法,常用於在整個程式中僅呼叫一次的程式碼。
具體操作
描述
從單例模式的描述來看,單例模式並不能用於多次頻繁呼叫的設計中,而更適用於程式開頭,用於讀取資源作啟動作用的設計,在這裡我們使用讀取資料庫的使用例項做例子。
例程式碼
package com.mannoroth.utils;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class ConfigManager {
//建立私有屬性及成員變數
private static ConfigManager configManager;
private static Properties properties ;
//建立私有構造
private ConfigManager(){
InputStream is = null;
try {
//建立·properties·做Properties物件
properties = new Properties();
is = ConfigManager.class.getClassLoader().getResourceAsStream("database.properties");
properties.load(is);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
if (is != null) {
is .close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//公有方法,開啟一個口使外部程式得以呼叫
public static ConfigManager getInstance(){
if (configManager == null) {
configManager = new ConfigManager();
}
return configManager;
}
//通過輸入key的值,從檔案中獲得對應的值
public static String getValues(String key){
return properties.getProperty(key);
}
}
單例模式的公有方法存在兩個模式,分別為:
1.懶漢模式
//在第一次呼叫的使用(configManager==null),使自己例項化
public static synchronized ConfigManager getInstance(){
if (configManager==null) {
configManager=new ConfigManager();
}
return configManager;
}
上述模式存在缺點,當該模式被多執行緒同時使用的時候,有可能會因此出現混亂,使兩者交錯,這時候我們可以通過使用再新增一重鎖定(synchronized)的屬性來保證執行緒安全。
解決方法:使用雙重鎖定
//在方法呼叫中再加入一重synchronized屬性
public static synchronized ConfigManager getInstance(){
synchronized (ConfigManager.class) {
if (configManager==null) {
configManager=new ConfigManager();
}
}
return configManager;
}
2.餓漢模式
public static ConfigManager getInstance(){
if (configManager==null) {
configManager=new ConfigManager();
}
return configManager;
}
餓漢模式在建立的同時就提供了一個靜態物件供程式呼叫,不會再發生變化,足矣保證現成安全。
兩種模式的區別:
餓漢模式:類一旦載入,就把單例初始化完成,保證getInstance的時候,單例是已經存在
懶漢模式:只有當呼叫getInstance的時候,才會去初始化這個單例。