標籤:
[Architecture Pattern] Factory Builder目的
同時提供延遲注入對象、掛載注入項目這兩個功能
情景
在開發系統時,如果需要在已耗用時間才產生並注入對象,可以套用Factory模式來提供延遲注入對象功能。例如:一個監控系統在火警發生時,建立功能對象來啟動相關裝置(洒水裝置、警報裝置、警消通報)。
但在實作過程中,延遲注入對象這個功能,常常需要伴隨掛載注入項目功能,用以增加系統的延展性,這時可以接著套用Builder模式,來提供掛載注入項目功能。例如:一個監控系統在火警發生時,依照購買版本建立功能對象來啟動相關裝置(V1:洒水裝置、警報裝置;V2:洒水裝置、警報裝置、警消通報;V3:....)。
本篇文章介紹上述這個Factory模式、Builder模式組合而成的Factory Builder模式。這個模式定義對象之間的職責跟互動,用來為系統同時提供延遲注入對象、掛載注入項目這兩個功能,用以增加系統的延展性。主要為自己做個紀錄,也希望能協助到有需要的開發人員。(使用DI Framework也能提供相關功能)
結構
參與者System- 擁有一個Factory
-
使用Factory來產生Product。
-
使用Product來提供系統功能。
Factory
Builder
Productm
-
封裝系統功能。
-
透過Builder產生並注入到系統。
合作方式
實作
-
類別圖
-
ActionFactory
public class ActionFactory{ // Fields private readonly IEnumerable<ActionBuilder> _actionBuilderCollection = null; // Constructors public ActionFactory(IEnumerable<ActionBuilder> actionBuilderCollection) { // Default _actionBuilderCollection = actionBuilderCollection; } // Methods public IEnumerable<IAction> Create() { // Result List<IAction> actionList = new List<IAction>(); // Create foreach (var actionBuilder in _actionBuilderCollection) { var action = actionBuilder.Create(); if (action == null) throw new InvalidOperationException(); actionList.Add(action); } // Return return actionList; }}
-
ActionBuilder
public abstract class ActionBuilder{ // Methods public abstract IAction Create();}
-
Action
public interface IAction{ // Methods void Execute();}
-
SecuritySystem
public class SecuritySystem{ // Fields private readonly ActionFactory _actionFactory = null; // Constructors public SecuritySystem(ActionFactory actionFactory) { // Default _actionFactory = actionFactory; } // Methods public void Execute() { // Create var actionCollection = _actionFactory.Create(); if (actionCollection == null) throw new InvalidOperationException(); // Execute foreach(var action in actionCollection) { action.Execute(); } }}
-
系統掛載:洒水裝置、警報裝置
class Program{ static void Main(string[] args) { // Initialize var actionBuilderList = new List<ActionBuilder>(); actionBuilderList.Add(new WateringActionBuilder()); actionBuilderList.Add(new AlarmActionBuilder()); var securitySystem = new SecuritySystem(new ActionFactory(actionBuilderList)); // Execute securitySystem.Execute(); // End Console.ReadLine(); }}
-
系統掛載:洒水裝置、警報裝置、警消通報
class Program{ static void Main(string[] args) { // Initialize var actionBuilderList = new List<ActionBuilder>(); actionBuilderList.Add(new WateringActionBuilder()); actionBuilderList.Add(new AlarmActionBuilder()); actionBuilderList.Add(new NotifyActionBuilder()); var securitySystem = new SecuritySystem(new ActionFactory(actionBuilderList)); // Execute securitySystem.Execute(); // End Console.ReadLine(); }}
下載
範常式序代碼:點此下載
[Architecture Pattern] Factory Builder