Java 構造方法私有化與單例模式

2021-07-23 18:16:08 字數 2386 閱讀 8689

先看乙個程式:

class singleton 

}public

class test

}

上面的singleton類裡是存在構造方法的(如果乙個類中沒有明確的定義乙個構造方法的話,會自動生成乙個無參預設的構造方法),現在把構造方法修改一下:

class singleton  // 構造方法私有化

public

void

print()

}

我們知道,構造方法被私有化,就無法在類外部例項化singleton物件。

那麼,此時,如何在test類裡面得到singleton類的例項化物件並且呼叫print()方法?

首先,這個類的構造方法被私有化,只能被本類所呼叫,所以可以在本類中產生本類的例項化物件:

class singleton  // 構造方法私有化

public

void

print()

}

我們知道,此時instance 屬性只是乙個普通屬性,必須在類例項化物件後再可以使用,要想不需要例項化物件直接使用,可以使用static宣告:

class singleton  // 構造方法私有化

public

void

print()

}public

class test

}

但是,我們知道,類中的全部屬性都應該封裝,以上的instance屬性也應該封裝:

private

static singleton instance = new singleton();

而封裝之後要想取得屬性。要編寫getter方法,不過這裡的getter方法應該也由類名稱直接呼叫,定義為static型,getinstance()方法:

class singleton  // 構造方法私有化

public

void

print()

public

static singleton getinstance()

}public

class test

}

為什麼這麼做呢?此時程式之中的instance屬性,屬於static,那麼,不管有多少個singleton類的物件,都共同擁有同乙個instance屬性

我們再來看,若getinstance()方法修改如下:

public

static singleton getinstance()

此時,發現,每呼叫一次getinstance()方法,就會例項化乙個singleton物件,這樣的話,例項化物件就不是唯一的了,所以,這種情況不能讓它出現,怎麼辦?可以在定義instance屬性的時候增加乙個final關鍵字:

private

static

final singleton instance = new singleton() ;

於是,最後的**就變成了這樣:

class singleton  // 構造方法私有化

public

void

print()

public

static singleton getinstance()

}public

class test

}

這樣的設計在設計模式上講就稱為單例設計模式(singleton)

單例設計模式的型別:

(1)餓漢式單例模式:當類裝載的時候就會建立類的例項,不管你用不用,先建立出來,然後每次呼叫的時候,就不需要再判斷。上面的程式就屬於餓漢式單例模式,

(2)懶漢式單例類:每次獲取例項都會進行判斷,看是否需要建立例項,如果一直沒有人使用的話,那就不會建立例項。**如下:

class singleton  // 構造方法私有化

public

void

print()

public

static singleton getinstance()

return instance;

}}

小結:單例模式的特點?

(1)構造方法被私有化(private);

(2)只能夠通過getinstance()方法取得singleton類的例項化物件,這樣不管外部如何操作,最終也只有乙個例項化物件;

(3)在單例設計模式之中,一定會存在乙個static方法,用於取得本類的例項化物件。

構造方法私有化與單例模式

單例模式 乙個類只有乙個例項化的物件,單例模式實現的核心是構造方法私有化,這樣就不能在類的外部建立該類的例項化物件,要想在類的外部使用構造方法私有化的類物件,只能在類的內部例項化乙個類物件,然後通過靜態方法返回該例項物件的引用,在外部進行呼叫。例如 建立乙個構造方法私有化的person類 publi...

java 從構造方法私有化引出單例模式

問題的引出 當對乙個類的構造方法進行私有化以後,我們不能以new的形式新建乙個物件,去呼叫物件的方法。如下 class singleton public void print 這個時候我們呼叫print 方法,需要如下 test public void test 程式編譯的時候會報錯。解決辦法 既然...

構造方法私有化 單例模式 Singleton

因程式需要,有時我們只需要某個類同時保留乙個物件,不希望有更多物件,此時,我們則應考慮單例模式的設計。例子 在日常生活中,有的時候為了出現二義性,我們把很多事情安排到乙個人來操作。就像我們想要得到特供的茅台酒的話,我們平常人是不可能弄到的。那必須找到這個的負責人,那麼不管誰都會找這個負責人才可以。這...