直接用靜態方法調用和單例模式的區別是什嗎?

來源:互聯網
上載者:User
如題,靜態方法是在記憶體中只初始化一次,而單例模式也是保證在記憶體中只執行個體化一個對象,那這兩者的區別是什嗎?我直接把資料庫連結放在靜態裡面不就行了嗎

回複內容:

如題,靜態方法是在記憶體中只初始化一次,而單例模式也是保證在記憶體中只執行個體化一個對象,那這兩者的區別是什嗎?我直接把資料庫連結放在靜態裡面不就行了嗎

一個可繼承,一個不可繼承。

其實沒有搞明白題主想問什麼。

單例模式是針對類的,靜態方法是方法而已,跟對象沒有直接聯絡。

當然不同,思考一點,靜態方法裡能用 this 嗎?

實際上需要具體看類是做什麼用的。

以題主的資料庫連接作為例子(實際上很多實體都可以作為例子),具體要看把什麼當成實體來分析設計:

例如,當我們認為網站是實體,那麼把串連資料庫這個事情當成網站的一個動作,就是在網站類中實現該靜態方法。然而為了節省記憶體,我們以為這個靜態方法在程式初始化時就載入,這樣就節省了記憶體,實際上我們在使用串連資料庫的時候仍然是調用了這個方法,仍然需要重新串連一次,在記憶體中仍然在重複造串連資源。

如果我們把資料庫當成一個實體,那麼串連資料庫這種事情當然是由這個實體來辦的,然而為了節省記憶體,我希望所有用到資料庫實體的情況都只使用那個已存在的執行個體,而不是每次都去建立串連,這時候單例模式就發揮了作用。

那麼把誰當成實體這種事情,當然是要看設計者具體應用到什麼情況。

為了改善我提到的第一個例子的問題,我們可以在類內寫一個靜態變數用於儲存串連資源:

class website {    private static $_conn = NULL;        public static function db_conn()    {        if (empty(self::$_conn))        {            $_conn = ...;//造一個串連        }        return $_conn;    }}

這樣就相當於類似的單例模式保持只有一個資源的情況了。

說了這麼多,實際上在使用的時候還是單例模式方便,至少我們可以把對資料庫的各種操作封裝起來變成一個非常實用的工具類,需要的時候就載入,多好。

我在從記憶體上說說吧

static維護至少有且只有一份,單例至多維護有且僅有一份存
記憶體是有限的,如果把所有的單例都用static來替換,原則上沒有問題,但記憶體會爆的。

單例只有在第一次使用的時候才會佔有記憶體(或者堆棧什麼的)

單例模式是針對類執行個體的,靜態方法是屬於類的方法。待用資料成員和單例有只初始化一次的特點,可以用靜態成員來實現單例模式。

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.