今天要講的是單件模式,其實單件模式是比較簡單的設計模式,在咱們平常開發過程當中也是常常用到的。程序員
單件模式:單件模式是一種用於確保整個應用程序中只有一個類實例且這個實例所佔資源在整個應用程序中是共享時的程序設計方法。設計模式
我想若是初學者對一些基本概念能熟練掌握時,其實單件模式是很簡單的,就是由於初學者對一些概念還不是很理解,咱們先來掃除這些阻擋咱們理解的障礙。ide
大部分的初學者都會搞不清楚「靜態對象」與「實例對象」的區別。固然誰都有一個過渡期,不要急慢慢來,只要咱們心平氣和的去學習就已經在走向成功的路上。函數
[任何設計模式都要求咱們熟練掌握基本OOP的思想]學習
只有咱們熟練的掌握了面嚮對象語言的基本語法、概念和一些面向對象的思想以後,咱們才能對設計模式進行討論、研究、編寫。若是咱們對面向對象語言的使用都還成問題時,再去學習設計模式恐怕愛莫能助了。固然誰也不敢保證能精通一門語言的全部語法,可是咱們必須保持一顆積極學習的心態,日積月累總能學了大差不離的。spa
障礙:靜態類與非靜態類的區別設計
所謂靜態類,就是這個類在程序的上下文中是靜態的,不會隨着一些垃圾回收、堆棧調整而變更地址。因此實例對象才能隨時的訪問靜態對象。靜態類的初始化工做是不肯定,通常在第一次調用靜態類的對象時執行。code
所謂非靜態類:就是類只是一個定義,須要用類做爲模板進行實例化出具體的實例對象,這個實例對象就是內存中的空間。實例對象的地址是不肯定,因此靜態對象沒法直接訪問非靜態實例對象。對象
我想上面的兩句話對初學者來講可能仍是不能起到理解做用,咱們仍是來畫個圖比較形象。blog
1:
Member是實例類,沒有static關鍵字修飾。這樣引起出兩個問題:1.爲何在實例類中能夠包含靜態對象?2.爲何在靜態類中不能包含實例對象?
其實這二者並不矛盾,咱們想想實例類是能夠被實例化的,咱們想用的時候就NEW一個出來,可是靜態類在程序的內中是靜態的,它一旦被初始化就肯定了內存位置,因此無論實例對象有多少個不肯定的位置,可是靜態對象的位置是肯定的,那麼實例程序員固然是在隨處均可以訪問靜態對象的。
可是反過來靜態對象是不可以包含實例成員的,由於實例成員不肯定位置,因此靜態類是找不到實例對象的內存地址的。你也許還會問,那麼爲何我在實例類中能夠定義兩種類型的對象,一種實例成員,一種靜態成員。咱們都知道在程序中是不可以存在兩個相同名稱的類的,其實咱們徹底能夠將上圖的一個類分解成兩個類,一個靜態和一個非靜態。這樣也可以實現相同的效果,可是這樣彷佛不能知足咱們的平常面向對象的開發。在平常生活中,就是有這種狀況存在的,比如我有個模板能夠往這個模板中倒入石膏造成必定的模型實體,石膏跟實體原本就是類與實例的關係,可是有些東西是每一個石膏所公用的信息,好比每一個實體都有一個出自哪一個模板的編號,因此每一個實體都必需要引用這個模板。經過這個引用編號,就能找到模板。
2:
雖然是一個Member類,可是咱們在使用的時候倒是兩中對象,這兩種對象都是從Member中動態分離出來的。只要咱們搞懂這個問題,對理解單件模式就簡單多了。
咱們下面進入單件模式的學習。
其實單件模式就是運用混合類的方式進行解決的,要保證類只有一個實例。咱們順着問題進行摸索,每一個實例類均可以經過調用構造函數進行實例化具體對象,那麼是否是不可以將這實例類的構造函數公開啊?固然不能公開了。咱們要經過一個靜態成員對實例對象保持整個生命週期的引用,當下次誰須要這個實例對象的時候咱們將讀取靜態成員中的引用,就能夠獲取到這惟一的實例了;
3:
代碼:
- using System;
- using System.Collections.Generic;
- using System.Text;
- namespace ConsoleApplication1
- {
- public class Member
- {
- /// <summary>
- /// 將默認構造函數設置成私有的
- /// </summary>
- private Member() { }
- /// <summary>
- /// 保存對Member但實例的引用
- /// </summary>
- private static Member slignmemer;
- /// <summary>
- /// 統一獲取Member對象的全局方法
- /// </summary>
- /// <returns></returns>
- public static Member GetMember()
- {
- if (slignmemer == null)
- {
- slignmemer = new Member();
- return slignmemer;
- }
- return slignmemer;
- }
- public int age;
- public int sex;
- public int scode;
- }
- }
總結:單件模式就講解完了,其實單件模式就是混合類的使用,只要咱們講類的使用熟練了單件模式也就能理解了。