如題,靜態方法是在記憶體中只初始化一次,而單例模式也是保證在記憶體中只執行個體化一個對象,那這兩者的區別是什嗎?我直接把資料庫連結放在靜態裡面不就行了嗎
回複內容:
如題,靜態方法是在記憶體中只初始化一次,而單例模式也是保證在記憶體中只執行個體化一個對象,那這兩者的區別是什嗎?我直接把資料庫連結放在靜態裡面不就行了嗎
一個可繼承,一個不可繼承。
其實沒有搞明白題主想問什麼。
單例模式是針對類的,靜態方法是方法而已,跟對象沒有直接聯絡。
當然不同,思考一點,靜態方法裡能用 this 嗎?
實際上需要具體看類是做什麼用的。
以題主的資料庫連接作為例子(實際上很多實體都可以作為例子),具體要看把什麼當成實體來分析設計:
例如,當我們認為網站是實體,那麼把串連資料庫這個事情當成網站的一個動作,就是在網站類中實現該靜態方法。然而為了節省記憶體,我們以為這個靜態方法在程式初始化時就載入,這樣就節省了記憶體,實際上我們在使用串連資料庫的時候仍然是調用了這個方法,仍然需要重新串連一次,在記憶體中仍然在重複造串連資源。
如果我們把資料庫當成一個實體,那麼串連資料庫這種事情當然是由這個實體來辦的,然而為了節省記憶體,我希望所有用到資料庫實體的情況都只使用那個已存在的執行個體,而不是每次都去建立串連,這時候單例模式就發揮了作用。
那麼把誰當成實體這種事情,當然是要看設計者具體應用到什麼情況。
為了改善我提到的第一個例子的問題,我們可以在類內寫一個靜態變數用於儲存串連資源:
class website { private static $_conn = NULL; public static function db_conn() { if (empty(self::$_conn)) { $_conn = ...;//造一個串連 } return $_conn; }}
這樣就相當於類似的單例模式保持只有一個資源的情況了。
說了這麼多,實際上在使用的時候還是單例模式方便,至少我們可以把對資料庫的各種操作封裝起來變成一個非常實用的工具類,需要的時候就載入,多好。
我在從記憶體上說說吧
static維護至少有且只有一份,單例至多維護有且僅有一份存
記憶體是有限的,如果把所有的單例都用static來替換,原則上沒有問題,但記憶體會爆的。
單例只有在第一次使用的時候才會佔有記憶體(或者堆棧什麼的)
單例模式是針對類執行個體的,靜態方法是屬於類的方法。待用資料成員和單例有只初始化一次的特點,可以用靜態成員來實現單例模式。