1. 程式人生 > 實用技巧 >C# 設計模式 工廠等

C# 設計模式 工廠等

1.單例模式

單例模式恐怕是很多開發人員最先接觸到的模式之一,可以認為就是一個全域性變數。它的初始化過程無非就是一開始就new 一個instance,或者惰性初始化等需要用到的時候new 一個instance。這裡需要注意的是在多執行緒情況下new一個instance。通常加上lock 可以解決問題。這裡我們利用C# 的系統函式 Interlocked.CompareExchange

internal class SingletonOne
    {
        private static SingletonOne _singleton;
        private SingletonOne()
        {
        }

        
public static SingletonOne Instance { get { if (_singleton == null) { Interlocked.CompareExchange(ref _singleton, new SingletonOne(), null); } return _singleton; } } }

2.工廠模式

工廠模式細分的話有簡單工廠模式、抽象工廠模式等。它最核心的就是如何通過 Factory new 一個 物件出來。在ASP.NET MVC 訊息處理實現過程中工廠模式運用的非常多。比如

在MVC中處理一個Request,其實就是呼叫Controller下的一個Action,這就需要從Url 和Route 中反射出Controller物件,內部由ControllerFactory建立。

簡單工廠模式:考慮用獨單的類來建立實列的過程,這就是工廠

角色:使用者,工廠,產品

目的是使得使用者將產品的消費和生產分開.在程式設計中就是將類的建立和使用分開.從而達到責任分離,其實這也是所有建立模式的目的之一.做法是工廠類根據使用者的要求(引數)來返回不同的類的例項.

工廠實現:採用引數化的靜態方法為使用者提供類例項的建立,如下所示:

public static ProductType FactoryMethod(引數)

{

根據引數返回需要類的例項.

}

簡單工廠有幾種情況:

1.產品只有一種,這種情況下方法沒必要帶引數.

2.產品有多種,且屬於同類型產品,則可以加入抽象產品.加入抽象產品的一個潛在好處是可以讓使用者可以不關心具體的產品,在設計和實現上可以做到一定程度上的延後聯編.

3.產品有多種,且型別各異,則可以考慮採用其它模式或者提供多個工廠方法來實現.但不鼓勵採用後者來實現(做事要專業).

4.在實際應用中產品角色,工廠角色以及使用者角色都可以根據實際情況合併.(模式變形)

簡單工廠模式的理解:

1.如果產品建立的時候需要使用者提供指導,則簡單工廠模式不適合,如果要適用就會使得工廠方法的引數過於複雜,因此本模式只適合使用者不關心產品構造邏輯,只關心使用的情況下(不關心構建,只關心使用).

2.大多數情況下使用者還是必須知道產品的具體細節,沒有減少對細節的依賴(特殊情況,有抽象產品的情況下,在某些應用中可以減少對具體產品的細節依賴).

3.採用靜態方法實現類的建立,好處是可以減少工廠類本身的建立,但缺點是失去了工廠類進行繼承擴充套件的優點.

4.簡單工廠模式的好處是實現了責任分離,對使用者來講同時也隱藏了構建產品的細節,而且實現起來比較簡單.

5.增加產品的時候,工廠類需要修改,也違背了面向物件的開放封閉原則.

6.只適合產品類比較少的情況,如果產品類太多,會使得靜態工廠方法過於龐大.

但現在有一種比較簡單的辦法,就是採用反射或者泛型來規避靜態方法過多而使得工廠類龐大的問題.

3:Facade(外觀模式):為子系統中的一組介面提供一個一致的介面,簡單的來說由一個類給他的子系統提供一組介面,比如股票與基金,買了基金相當於股票都買了,也就是說我只需要提供一個買基金的類就可以了

4:Observer(觀察者模式): 讓多個觀察者物件同時監聽一個主題物件,這個主題物件發生狀態變化時,通知所有觀察者物件,使他們自動更新自己,什麼是委託,委託就是一種引用方法的一種型別,當為委託分配了方法,委託與方法就有相同的行為了。