同时提供延迟注入对象、挂载注入项目这两个功能
在开发系统时,如果需要在运行时间才生成并注入对象,可以套用Factory模式来提供延迟注入对象功能。例如:一个监控系统在火警发生时,建立功能对象来启动相关设备(洒水设备、警报设备、警消通报)。
物件图
但在实作过程中,延迟注入对象这个功能,常常需要伴随挂载注入项目功能,用以增加系统的延展性,这时可以接着套用Builder模式,来提供挂载注入项目功能。例如:一个监控系统在火警发生时,依照购买版本建立功能对象来启动相关设备(V1:洒水设备、警报设备;V2:洒水设备、警报设备、警消通报;V3:....)。
物件图
本篇文章介绍上述这个Factory模式、Builder模式组合而成的Factory Builder模式。这个模式定义对象之间的职责跟互动,用来为系统同时提供延迟注入对象、挂载注入项目这两个功能,用以增加系统的延展性。主要为自己做个纪录,也希望能帮助到有需要的开发人员。(使用DI Framework也能提供相关功能)
示意图
物件图
使用Factory来生成Product。
使用Product来提供系统功能。
拥有多个Builder
使用Builder来生成Product。
在条件生成Product情景中,Factory封装条件逻辑。
生成Product,生成参数由Builder提供。
在条件生成Product情景中,Builder封装条件参数。
封装系统功能。
透过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
原文:http://www.cnblogs.com/clark159/p/4230191.html