最簡單的單例模式

2021-10-10 19:24:37 字數 1736 閱讀 5445

1.啥是單例模式?

答:單例模式就是乙個類只有乙個例項

2.為啥不用全域性變數來實現呢?

答:因為單例模式既能有全域性變數的優點,可以全域性訪問,但是沒有全域性變數的缺點

3.啥缺點?

答:如果我們要在乙個全域性指令碼中放乙個物件,那麼我們要在程式執行前就建立好,如果是開發遊戲,我們要在遊戲執行前建立好這個物件,但是如果程式在執行時沒有用到呢

比如在遊戲中需要對需要動態載入資源進行管理(resmgr),對很多彈窗進行管理(uimgr),對場景進行管理(場景切換,當前是哪個場景),這些manager都是單例,如果不使用單例也可以把這些mgr寫成乙個類,在遊戲開始之前,例項化這些類,但是只例項化一次,儲存在全域性變數中

單例的好處就是需要的時候,在進行例項化,不用把啥東西都放在全域性變數中

4.如何實現單例模式?

先了解兩個概念,靜態方法和靜態變數

4.1.啥是靜態變數

乙個類是所有例項的藍圖,模板,照著這個模板我們可以造出很多例項,在寫乙個類的時候,類有一些屬性,還有一些方法,這些屬性也可以被叫做變數,用來儲存例項的狀態和資料,比如我們要建立乙個dog類,我們需要乙個color來儲存狗的顏色。乙個類的變數對所有的例項都是不變的,那麼這個變數就叫靜態變數(靜態屬性),,比如dog類需要乙個靜態變數bark:『wangwang』,來表示所有的狗的叫聲都是一樣的

class

dog

如果這變數對每個例項都是不一樣的,就叫例項變數,或者也可以叫屬性

4.2 啥是靜態方法

靜態方法是不需要進行例項化,就能呼叫的方法,就是靜態方法,比如math.round(),我們不需要例項化乙個math物件出來,就能直接呼叫這個方法,當然你也無法例項化出這個物件,因為這個math類的建構函式是私有的,不允許你進行訪問,大概就是這個意思

凡是這個乙個方法不需要用到例項變數,那麼對所有例項來說,這個方法是一樣的,不需要從類例項化出乙個物件,可以直接從類的身上呼叫,那麼你需要建立的這個方法前面也需要加上static關鍵字,代表這個方法是靜態方法

重點來了

假設我們需要建立乙個資源載入管理類 resmgr,我們可以用靜態變數來儲存這個類的例項,使用靜態方法來返回這個類的例項,因為靜態方法不需要例項化類就能呼叫,在靜態方法中,我們只對這個類例項化了一次,對這個resmgr我們第一次呼叫getinstance的方法,訪問這個類的靜態變數,我們例項化出了乙個resmgr的例項,第二次呼叫這個getinstance的方法的時候,我們我們再次訪問到了這個類的靜態變數,靜態變數已經有值了,不會二次例項化

//這裡只寫了乙個大概的框架

class

resmgr

private loadedassetmap =

newmap()

;static instance =

null; //resmgr的單例

static

getinstance()

return

this

.instance;

}public

loadasset()

public

loadassetsync()

public

getasset()

public

releaseasset()

}

最簡單的單例模式

如果乙個類始終只能建立乙個例項,則這個類被稱為單例類。在一些特殊的場景下,要求不允許自由建立該類的物件,而是只允許為該類建立乙個物件。為了避免其他類自由建立該類的例項,我們把該類的構造器使用private修飾,從而把該類的所有構造器隱藏起來。根據良好封裝的原則 一單把該類的構造器隱藏起來,則需要提供...

單例模式最簡單可靠的寫法

單例模式大家都知道有兩種方式,一種是餓漢式,一種是懶漢式 餓漢式 一開始就初始化例項 public class singleton public static singleton getinstance 懶漢式,記住這種雙重檢查的方式,保證執行緒的安全 public class singleton ...

最普通的單例模式

最近閒來無事,回憶了最簡單的單例模式。經過了乙個小時的嘗試加修改,終於寫好了。下面分享一下我犯傻的地方 ps 這次的單例模式不涉及加鎖之類,只是最基本的單例模式 廢話不多說,先上 includeusing namespace std class singleton private singleton...