一.引入
小菜遇到的問題:“工具箱”窗體無法讓其隻出現一次。
大鳥的回答:“工具箱”類也需要計劃生育。
二.解決過程
① 最初的寫法:
這樣,點選一次工具箱按鈕,就會出現一個窗體。就像下圖一樣:
② 判斷對象是否為null:
這樣,确實可以做到隻允許一個工具箱窗體出現,可是在程式未退出前關閉了窗體一次,下一次點選時工具箱窗體也将不再出現。原因很簡單,就是因為已經執行個體化一次。
③ 增加isdisposed屬性判斷:
這樣,就可以解決在②中遇到的問題,即使關閉過,也可再次執行個體化。
④ 将上述方法進行抽象整理:
這樣,看似已經沒有問題,可實際上有個重要的問題就是究竟應該由誰負責判斷是否執行個體化。按道理說,應該由工具箱自己判斷,而在這裡是在主窗體form1代碼裡判斷。是以,還需要修改。
⑤ 在工具箱類中判斷執行個體化:
這樣,才真正做到了自己負責。
三.應用
單例模式(singleton):保證一個類僅有一個執行個體,并提供一個通路它的全局通路點。
建立單例類:
四.擴充
① 多線程時的單例
場景舉例:兩個人進屋,一個人打開門進去了,當第二個人來時,同樣也是自己打開門就進了,這樣就相當于建立出了多個執行個體。
為了防止此類現象的發生,就需要加一把鎖。一個人進屋後把門鎖上,直至離開才開鎖,另一個人才可進入。這樣就相當于控制隻建立了一個執行個體。
② 雙重鎖定
場景再現:兩個人進屋,按照上述方法,不管屋裡有沒有人,都要先上鎖。這樣如果沒有人,反而造成了不必要的麻煩。是以,先進行判斷,是否執行個體化過。如果執行個體化了,就上鎖,沒有則直接進入。
③ 靜态初始化
場景再現:進屋的第一個人,阻止别人進來(想象成他是害怕屋裡的好吃的也被其他人吃),除非自己已離開。是以也稱之為餓漢式單例類。
五.學習心得
單例模式的這一遍總結,不僅僅隻是看了一遍才完成的,每一遍,自己都會在以前的基礎上學到更多。聯系到機房收費系統,第一遍的時候,我們會周遊每個窗體進而使得界面隻允許一個加載一個窗體。現在我們學習了單例模式,這時,就可以加以應用。設計模式的學習重要的不是實作每個代碼,應該是去了解,等到以後能夠學以緻用。