建立型模式可以隔離客戶程式對需要例項化型別的依賴關係,這類模式一般通過將例項化具體物件的職責委託給第三方物件的方式,使得客戶程式或者外部系統在獲得所需的具體型別例項的同時,而不必對其發生直接的引用。
建立型模式包括:
按照大多數設計模式書籍採用的順序,首先從工廠方法模式開始。
簡單工廠模式並沒有被歸入23種設計模式之列,但可以作為學習工廠方法模式前的預備。簡單工廠模式在管理物件建立方面,提供的是最簡單的方案,它僅僅簡單的對不同類物件的建立進行了一層薄薄的封裝,客戶程式在使用時,通過向簡單工廠傳遞乙個型別來指定要建立的物件,其uml類圖如下:
client需要的是具體的產品concreteproducta或者concreteproductb,如果直接new()就會依賴物件例項,引入簡單工廠後,client變成了依賴iproduct和samplefactory。
**示例:
//產品介面
public inte***ce iproduct ;
//具體產品
public class concreteproducta : iproduct
public class concreteproductb : iproduct
public enum category
//簡單工廠
public class samplefactory}}
呼叫:
[test]
public void samplefactorytest()
簡單工廠模式中的工廠負責生產所有的產品型別,但如果工廠負責生產的產品只有一種,就可以進一步抽象了,這便出現了工廠模式。
gof對工廠方法模式的描述是:
define an inte***ce for creating an object, but let subclasses decide which class toinstantiate. factory method lets a class defer instantiation to subclasses…
— design patterns : elements of reusable object-oriented software
工廠方法模式定義了乙個抽象的工廠,它的子類實體工廠都有統一通用的工廠方法,用來生產具體的產品,這樣就把類的例項化延遲到其子類。
工廠方法主要有四個角色:
uml類圖
**示例:
//抽象產品型別
public inte***ce iproduct
//抽象產品所必須具有的特徵
}//具體產品型別
public class producta : iproduct }}
public class productb : iproduct }}
//抽象工廠型別
public inte***ce ifactory
//具體工廠型別
public class factorya : ifactory
}public class factoryb : ifactory
}
呼叫:
public class client1
}
客戶程式需要使用iproduct的時候,只需要獲取到ifactory,通過呼叫其統一制定的create()方法就可以獲取到具體的產品,具體需要哪個產品由factory決定。這樣就隔離了客戶程式對具體產品的依賴,但這裡還有個問題是在獲取ifactory的時候需要初始化具體的工廠,這樣就對具體的工廠產生了依賴。
ioc與工廠方法模式的結合
為了解決上述問題,可以把ifactory作為客戶程式的引數,然後採用依賴注入的方式將具體的工廠注入:
public class client2
public string somemethod()
}
這樣客戶程式就變成了真正地只依賴ifactory和iproduct了,但問題是不論採用哪種依賴注入框架,都需要註冊介面與例項的對映關係,那麼這種方式就只是相當於把對具體產品的依賴「甩」到了「客戶程式的客戶程式」,怎麼辦呢,退無可退的時候,考慮把介面與例項的對映關係放到配置檔案吧。
泛型工廠
上面的工廠方法模式中,每個具體的工廠負責生產一種產品,且都實現了抽象工廠的create()方法,於是借助泛型可以實現進一步的抽象:
public inte***ce ifactory
public abstract class factorybase: ifactorywhere t : new()
}public class productafactory : factorybase
}public class productbfactory : factorybase
在抽象工廠和具體的工廠之間增加了支援泛型的factorybase,在這裡實現了通用的create()方法。如果某個具體工廠需要特殊的create流程,只需重寫虛方法即可。這樣在工廠種模擬較多而流程有大多相同的情況下,可以減少很多**。
委託工廠
前面**中的工廠生產的產品都是物件,如果需要生產的是方法呢,c#的委託機制可以方便地滿足這種需求。
委託的本質是方法的指標,是對一類方法的抽象。所以委託本身就可以作為抽象產品的定義,而與委託簽名一致的方法就是具體產品了。
**示例:
public delegate int calculatehandler(params int items);
public class calculator
return result;
}public int multi(params int items)
return result;
}}public class addhandle***ctory : ifactory
}public class multihandle***ctory : ifactory
}
呼叫:
[test]
public void calculatehandlertest()
設計模式(1) 工廠方法模式
工廠方法模式uml類圖如圖所示 說明 具體產品繼承抽象產品,具體工廠繼承抽象工廠,具體工廠依賴具體產品。具體例項 如下所示 其實是在簡單工廠模式例項 的基礎上對工廠類進行了一下抽象 抽象工廠類 public abstract class abstractfactory具體產品a工廠類 ublic c...
設計模式 1 工廠方法模式
簡單工廠模式有個問題是,類的建立是需要依賴工廠類的,如果要拓展程式,那麼需要對工廠類進行修改,這個增加了風險。工廠方法模式可以避免這種情況,方法建立乙個工廠介面和建立多個工廠類,理解如下 對了抽象方法a,b和c分別為其的兩個不同實現,現在建立工廠介面d,工廠介面d的實列類e和f分別對b和c進行實列化...
設計模式1 工廠方法模式
關於工廠的設計模式,我們可以列出來這三個,既然是都和工廠有關,當然就少不了他們的比較,這裡簡單說下,在比較中理解以便更好的學習。本篇著重講工廠方法模式。簡單工廠模式不屬於23種經典設計模式的一種,是乙個專門生產某個產品的類,例如 乙個鍵盤工廠,不管生產什麼牌子的鍵盤,就只能生產鍵盤,對鍵盤的邏輯操作...