先聊一下關於設計的幾個原則(1)單一原則(SRP):一個類應該僅有一個引起它變化的原因 :意思就是 (一個類,最好只負責一件事情,並且只有一個引起它變化的原因(2)開閉原則(OCP): 應該對擴展開放,但是對修改關閉:意思是(模塊通過擴展的方式去應對需求的變化,應該儘量在不修改源代碼的基礎上面擴展) ...
先聊一下關於設計的幾個原則
(1)單一原則(SRP):一個類應該僅有一個引起它變化的原因 :意思就是 (一個類,最好只負責一件事情,並且只有一個引起它變化的原因
(2)開閉原則(OCP): 應該對擴展開放,但是對修改關閉:意思是(模塊通過擴展的方式去應對需求的變化,應該儘量在不修改源代碼的基礎上面擴展)
(3)依賴倒置原則(DIP):高層模塊不應該依賴低層模塊,兩者都應該依賴其抽象;抽象不應該依賴細節,細節應該依賴抽象
高層模塊不應該直接依賴於底層模塊的具體實現,而應該依賴於底層的抽象。模塊間的依賴是通過抽象發生,不發生直接的依賴關係,依賴關係是通過介面或抽象類為中間件產生的。
(4)LisKov 替換原則(LSP)(里式替換原則) :子類對象可以替換父類對象的位置 這裡如果想瞭解的更清晰的話 瞭解一下 (斜變/逆變)
(5) 介面的隔離原則(IPS):(1)是不應該強行要求客戶端依賴於它們不用的介面;(2)是類之間的依賴應該建立在最小的介面上面。簡單點說,客戶端需要什麼功能,就提供什麼介面,對於客戶端不需要的介面不應該強行要求其依賴;類之間的依賴應該建立在最小的介面上面,這裡最小的粒度取決於單一職責原則的劃分。
還有其他 理解不深可就沒敢說出來.
設計模式(1)單例模式(創建模式)
註意事項:
1. 允許子類派生
2. 不要實現 icloneable 介面 https://msdn.microsoft.com/zh-cn/library/system.icloneable.aspx 這個介面繼承後可能會導致生成多個示例,違背了模式的原本意思
3. 不要序列化 理由同上
4. 不要再多線程下使用,(如果需要再多線程下使用的話見下麵舉例)
單利模式作用
(1)確保一個類只有一個實例;
(2)提供一個訪問它的全局訪問點
利用代碼實現一個簡潔的單例
class SingletonClass { private static volatile SingletonClass instance = new SingletonClass(); //私有的構造函數 private SingletonClass() { } public static SingletonClass Newinstance { get { return instance; } } }
這個類在被調用時 SingletonClass.Newinstance();
優點:(1)確保一個類只有一個實例;
(2)提供一個訪問它的全局訪問點
缺點:(多線程環境下就會破壞單利的初衷:會形成多個類的實例)
利用代碼實現 在多線程環境下的單例
通過雙重判斷 對資源進行鎖定 確保再多線程環境下確保只有一個實例
註意:代碼註釋
class multithreading_Singleton { //為了以防萬一的出現 //volatile 關鍵字作用 當編譯編譯過程中 會對代碼進行細微的調整,為了防止代碼發生改變保證代碼原意不變 多線程使用時有可能會導致 順序發生改變 導致多個實例的發生 private static volatile multithreading_Singleton example = null; //聲明一個資源鎖 private static object Lock = new object(); //私有的構造函數 private multithreading_Singleton() { } public static multithreading_Singleton Newinstance { get { //保證多個線程不會同時進入判斷 if (example == null) { //對資源進行鎖定 Lock 只要是object 下的類型就OK了 lock (Lock) { if (example == null) { example = new multithreading_Singleton(); } } } return example; } } }
利用代碼實現 單線程多線程通用單例
優點:靜態構造函數 在調用時 只會產生一個,系統在預設的情況下仿佛已經對資源加過鎖
缺點是不能帶參數
原因: (1):靜態函數不允許不允許出現訪問修飾符
(2):靜態構造函數必須無參數
class SingletonCurrency { public static readonly SingletonCurrency example = new SingletonCurrency(); private SingletonCurrency() { } }
下麵代碼是讀上面代碼的解釋代碼:
public static readonly SingletonCurrency example = new SingletonCurrency(); 等同於省略了靜態構造函數,這裡的省略不是編譯上的省略而是代碼上的省略,在系統編譯時還是會有一個靜態構造的
class SingletonCurrency_Remark { public static readonly SingletonCurrency_Remark example ; /// <summary> /// 靜態構造函數 /// </summary> static SingletonCurrency_Remark() { example = new SingletonCurrency_Remark(); } private SingletonCurrency_Remark() { } }
推薦書籍 大話設計模式 (中文) 《Head First 設計模式》
希望大家指出不足之處 謝謝