單例模式的使用情況:
1. 想確保任何情況下的時候都絕對只有一個實例。
2. 想在程序上表現出“只存在一個實例”
這是什麼意思呢?意思就是你要確保在程序中只存在某個類的唯一實例。
爲什麼會有這樣的設計模式呢?它的使用範圍在哪裏呢?
一般單例模式使用多在與數據庫鏈接,因爲確保程序中只有一個數據庫鏈接實例對數據庫進行操作,如果同時存在多個數據庫鏈接對數據庫進行操作的話就有可能導致一些意想不到的Bug出現。
就像一個數據庫鏈接對數據庫進行了增加了用戶操作。
另外一個數據庫連接對對數據庫進行了刪除用戶操作。
這樣在一個線程裏面的話就有可能導致Bug。
單例模式代碼展示
package singleton;
public class DatabaseConnection {
// 注意這裏的DatabaseConnection的實例必須是private和static的。
private static DatabaseConnection dbConnection=null;
//爲了避免在其他的地方可以通過new DatabaseConnection()
//創造出一個新的DatabaseConnection實例,需要將它的構造方法改成爲private
//這樣在其他地方就不能再使用new DatabaseConnection()來生成一個實例
//這樣也就確保了程序中只有一個實例。
private DatabaseConnection() {
super();
System.out.println("生成了一個DatabaseConnection實例");
}
// 這個方法至關重要,必須將這個獲取到DatabaseConnection實例的方法設置
// 成爲public和static的。
// 同時裏面的邏輯爲如果dbConnection還未被創造的話就創造一個實例。
// 如果已經創造了就直接返回一個實例。
public static DatabaseConnection GetDatabaseConnectionInstance() {
if (dbConnection==null) {
dbConnection=new DatabaseConnection();
}
return dbConnection;
}
}
測試單例模式的main函數
package singleton;
public class TestSingleton {
public static void main(String[] args) {
DatabaseConnection dbcon1 = DatabaseConnection.GetDatabaseConnectionInstance();
DatabaseConnection dbcon2 = DatabaseConnection.GetDatabaseConnectionInstance();
if (dbcon1 == dbcon2) {
System.out.println("dbcon1與dbcon2是同一個實例");
} else {
System.out.println("dbcon1與dbcon2不是同一個實例");
}
}
}
測試結果
生成了一個DatabaseConnection實例
dbcon1與dbcon2是同一個實例