C 設計模式之 單例模式

2021-09-12 21:40:21 字數 2092 閱讀 5095

確保乙個類只有乙個例項,並提供乙個全域性訪問點。

類定義私有建構函式,外部就不能通過new來建立物件,然後定義乙個公開方法來提供全域性的訪問點。

/// /// 單例模式的實現

///

public class singleton

/// /// 定義公有方法提供乙個全域性訪問點,同時你也可以定義公有屬性來提供全域性訪問點

///

///

public static singleton getinstance()

return uniqueinstance;

}}

這樣寫看上去是沒有問題, 但是有沒有那種可能, 同時兩個動作都判斷這個物件為空, 那麼這個物件就會被建立2次?是的, 多執行緒中, 這樣是無法保證單例。

測試**:

static void main(string args)

)); }

}

結果: 被建立 被建立 被建立 被建立

就像這樣, 同時建立多個執行緒去建立這個物件例項的時候, 會被多次建立, 這個時候, 對**改進一下。

/// /// 單例模式的實現

///

public class singleton

/// /// 定義公有方法提供乙個全域性訪問點,同時你也可以定義公有屬性來提供全域性訪問點

///

///

public static singleton getinstance()

}return uniqueinstance;

}}

測試**:

static void main(string args)

)); }

}

結果: 路過 被建立 路過 路過 路過 路過

上面, 我們建立了多個執行緒,同時去建立這個物件的例項, 在第二次,物件命名已經被建立了, 儘管只建立了一次滿足了我們的需求, 但是我們已知物件被建立了, 還需要進來做不必要的動作嗎?

我們都知道, 同步鎖為了達到預期的效果, 也是損耗了效能的, 那麼下面的輸出, 很顯然是沒必要的動作, 所以我們優化一下。

/// /// 單例模式的實現

///

public class singleton

/// /// 定義公有方法提供乙個全域性訪問點,同時你也可以定義公有屬性來提供全域性訪問點

///

///

public static singleton getinstance()}}

return uniqueinstance;

}}

測試**:

static void main(string args)

)); }

}

結果: 路過 被建立

很顯然, 這樣達到了我們的預期, 物件在被建立後, 就沒必要做多餘的行為。

優點1:單例模式會阻止其他物件例項化其自己的單例物件的副本,從而確保所有物件都訪問唯一例項。 優點2:因為類控制了例項化過程,所以類可以靈活更改例項化過程。

缺點1:雖然數量很少,但如果每次物件請求引用時都要檢查是否存在類的例項,將仍然需要一些開銷。可以通過使用靜態初始化解決此問題。 缺點2:使用單例物件(尤其在類庫中定義的物件)時,開發人員必須記住自己不能使用new關鍵字例項化物件。因為可能無法訪問庫源**,因此應用程式開發人員可能會意外發現自己無法直接例項化此類。 缺點3:不能解決刪除單個物件的問題。在提供記憶體管理的語言中(例如基於.net framework的語言),只有單例類能夠導致例項被取消分配,因為它包含對該例項的私有引用。在某些語言中(如 c++),其他類可以刪除物件例項,但這樣會導致單例類**現懸浮引用。

/// /// 單例模式的實現

///

public class singleton

// 定義私有建構函式,使外界不能建立該類例項

private singleton()

public static singleton instance

}}

C 設計模式之單例模式

在遊戲開發過程中,我們時常會遇到單例模式的運用場景。比如你遊戲當中的最終boss,你希望你的boss只能有乙個,所以這裡你就可以用單例模式 那麼什麼是單例模式呢?看下面的 分析。include include using namespace std class singleton public st...

C 設計模式之單例模式

設計模式是以理論的高度,總結了開發過程中的一多種不同的方法,在各種設計模式中,它們都有著不同實現方式,所起的作用也不相同,我最近看了部分設計模式,主要是以我自己的理解來闡述對它們的看法。我們可以看到單例的大概實現是很簡單的。幾個需要注意的地方是 只有當我們的建構函式為私有時,此時,我們在類外部就不能...

C 設計模式之 單例模式

單例模式,故名思義,其意圖是保證乙個類只有乙個例項,並提供乙個訪問它的全域性訪問點,該例項被所有的程式模組共享.在很多地方要用到這種設計模式,如系統的日誌輸出,作業系統的視窗,乙個pc連乙個鍵盤等.單例模式有許多實現方法.第一次呼叫該類例項的時候才產生乙個新的該類例項,並在以後僅返回此例項,需要加鎖...