在本教程中,我們將借助示例學(xué)習(xí)單例設(shè)計模式以及如何在Java中應(yīng)用它。
Singleton(單例)是一種設(shè)計模式,而不是Java特有的功能。它確保只創(chuàng)建一個類的實例。
設(shè)計模式就像我們的代碼庫一樣,其中包含世界各地程序員共享的各種編碼技術(shù)。
下面是我們?nèi)绾卧贘ava中使用單例的方法。
創(chuàng)建一個private的構(gòu)造函數(shù),該構(gòu)造函數(shù)限制在類之外創(chuàng)建對象
創(chuàng)建一個引用單例對象的private屬性。
創(chuàng)建一個public static方法,該方法允許我們創(chuàng)建和訪問我們創(chuàng)建的對象。 在方法內(nèi)部,我們將創(chuàng)建一個條件來限制我們創(chuàng)建多個對象。
這是一個實例。
class SingletonExample {
//引用對象的私有字段
private static SingletonExample singleObject;
private SingletonExample() {
//SingletonExample類的構(gòu)造函數(shù)
}
public static SingletonExample getInstance() {
//編寫僅允許我們創(chuàng)建一個對象的代碼
//根據(jù)需要訪問對象
}
}在以上示例中,
private static SingletonExample singleObject - 對類對象的引用。
private SingletonExample() - 私有構(gòu)造函數(shù),用于限制在類外部創(chuàng)建對象。
public static SingletonExample getInstance() - 此方法返回對該類唯一對象的引用。 由于該方法是靜態(tài)的,因此可以使用類名進行訪問。
使用數(shù)據(jù)庫時可以使用單例。它們可用于創(chuàng)建連接池以訪問數(shù)據(jù)庫,同時為所有客戶端重用相同的連接。例如,
class Database {
private static Database dbObject;
private Database() {
}
public static Database getInstance() {
//創(chuàng)建對象(如果尚未創(chuàng)建)
if(dbObject == null) {
dbObject = new Database();
}
//返回單例對象
return dbObject;
}
public void getConnection() {
System.out.println("現(xiàn)在已經(jīng)連接到數(shù)據(jù)庫。");
}
}
class Main {
public static void main(String[] args) {
Database db1;
//引用Database的唯一對象
db1= Database.getInstance();
db1.getConnection();
}
}當(dāng)我們運行程序時,輸出將是:
現(xiàn)在已經(jīng)連接到數(shù)據(jù)庫。
在上面的示例中,
我們創(chuàng)建了一個單例類Database。
dbObject是一個類類型字段。 這將引用類Database的對象。
私有構(gòu)造函數(shù)Database(),可防止在類外部創(chuàng)建對象。
靜態(tài)類類型方法getInstance()將類的實例返回給外部。
在Main類中,我們具有類類型變量db1。 我們正在使用db1調(diào)用getInstance()來獲取Database的唯一對象。
該方法getConnection()只能使用的對象進行訪問Database。
由于Database只能有一個對象,因此所有客戶端都可以通過單個連接訪問數(shù)據(jù)庫。
需要注意的是,只有少數(shù)情況(如日志)使單例有意義。甚至數(shù)據(jù)庫連接通常也不應(yīng)該是單例的。
如果您不確定是否使用單例,我們建議您避免完全使用單例。