zoukankan      html  css  js  c++  java
  • [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

    下载

    范例程序代码:点此下载

  • 相关阅读:
    【解题报告】2019正睿Day2
    如何卡SPFA
    【游记】2019国庆清北刷题营
    CF427D Match & Catch
    P2178 [NOI2015] 品酒大会
    Loj#6071. 「2017 山东一轮集训 Day5」字符串
    SP8093 JZPGYZ
    P3346 [ZJOI2015]诸神眷顾的幻想乡
    CF1037H Security
    CF932F Escape Through Leaf
  • 原文地址:https://www.cnblogs.com/clark159/p/4230191.html
Copyright © 2011-2022 走看看