[Architecture Pattern] Factory Builder

[Architecture Pattern] Factory Builder

目的

同时提供延迟注入对象、挂载注入项目这两个功能

情景

在开发系统时,如果需要在运行时间才生成并注入对象,可以套用Factory模式来提供延迟注入对象功能。例如:一个监控系统在火警发生时,建立功能对象来启动相关设备(洒水设备、警报设备、警消通报)。

  • 物件图

    情景01

但在实作过程中,延迟注入对象这个功能,常常需要伴随挂载注入项目功能,用以增加系统的延展性,这时可以接着套用Builder模式,来提供挂载注入项目功能。例如:一个监控系统在火警发生时,依照购买版本建立功能对象来启动相关设备(V1:洒水设备、警报设备;V2:洒水设备、警报设备、警消通报;V3:....)。

  • 物件图

    情景02

本篇文章介绍上述这个Factory模式、Builder模式组合而成的Factory Builder模式。这个模式定义对象之间的职责跟互动,用来为系统同时提供延迟注入对象、挂载注入项目这两个功能,用以增加系统的延展性。主要为自己做个纪录,也希望能帮助到有需要的开发人员。(使用DI Framework也能提供相关功能)

  • 示意图

    情景03

结构

  • 物件图

    结构01

参与者

System

  • 拥有一个Factory

  • 使用Factory来生成Product。

  • 使用Product来提供系统功能。

Factory

  • 拥有多个Builder

  • 使用Builder来生成Product。

  • 在条件生成Product情景中,Factory封装条件逻辑。

Builder

  • 生成Product,生成参数由Builder提供。

  • 在条件生成Product情景中,Builder封装条件参数。

Productm

  • 封装系统功能。

  • 透过Builder生成并注入到系统。

合作方式

  • 顺序图

    合作方式01

实作

  • 类别图

    实作01

  • 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();
        }
    }
    

    实作02

  • 系统挂载:洒水设备、警报设备、警消通报

    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();
        }
    }
    

    实作03

下载

范例程序代码:点此下载

posted @ 2015-01-17 10:31  Clark159  阅读(234)  评论(0编辑  收藏  举报