在本教程中,我們將借助示例學(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)的,因此可以使用類名進(jìn)行訪問。
使用數(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)我們運(yùn)行程序時,輸出將是:
現(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()只能使用的對象進(jìn)行訪問Database。
由于Database只能有一個對象,因此所有客戶端都可以通過單個連接訪問數(shù)據(jù)庫。
需要注意的是,只有少數(shù)情況(如日志)使單例有意義。甚至數(shù)據(jù)庫連接通常也不應(yīng)該是單例的。
如果您不確定是否使用單例,我們建議您避免完全使用單例。