[Architecture Pattern] Factory Builder
[Architecture Pattern] Factory Builder
目的
同时提供延迟注入对象、挂载注入项目这两个功能
情景
在开发系统时,如果需要在运行时间才生成并注入对象,可以套用Factory模式来提供延迟注入对象功能。例如:一个监控系统在火警发生时,建立功能对象来启动相关设备(洒水设备、警报设备、警消通报)。
-
物件图
但在实作过程中,延迟注入对象这个功能,常常需要伴随挂载注入项目功能,用以增加系统的延展性,这时可以接着套用Builder模式,来提供挂载注入项目功能。例如:一个监控系统在火警发生时,依照购买版本建立功能对象来启动相关设备(V1:洒水设备、警报设备;V2:洒水设备、警报设备、警消通报;V3:....)。
-
物件图
本篇文章介绍上述这个Factory模式、Builder模式组合而成的Factory Builder模式。这个模式定义对象之间的职责跟互动,用来为系统同时提供延迟注入对象、挂载注入项目这两个功能,用以增加系统的延展性。主要为自己做个纪录,也希望能帮助到有需要的开发人员。(使用DI Framework也能提供相关功能)
-
示意图
结构
-
物件图
参与者
System
-
拥有一个Factory
-
使用Factory来生成Product。
-
使用Product来提供系统功能。
Factory
-
拥有多个Builder
-
使用Builder来生成Product。
-
在条件生成Product情景中,Factory封装条件逻辑。
Builder
-
生成Product,生成参数由Builder提供。
-
在条件生成Product情景中,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(); } }
下载
范例程序代码:点此下载
期許自己~
能以更簡潔的文字與程式碼,傳達出程式設計背後的精神。
真正做到「以形寫神」的境界。