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

下载

范例程序代码:点此下载

[Architecture Pattern] Factory Builder的更多相关文章

  1. [Architecture Pattern] Singleton Locator

    [Architecture Pattern] Singleton Locator 目的 组件自己提供Service Locator模式,用来降低组件的耦合度. 情景 在开发系统时,底层的Infrast ...

  2. [Architecture Pattern] Repository实作查询功能

    [Architecture Pattern] Repository实作查询功能 范例下载 范例程序代码:点此下载 问题情景 在系统的BLL与DAL之间,加入Repository Pattern的设计, ...

  3. [Design Pattern] Factory Pattern 简单案例

    Factory Pattern , 即工厂模式,用于创建对象的场景,属于创建类的设计模式 . 下面是一个工厂模式案例. Shape 作为接口, Circle, Square, Rectangle 作为 ...

  4. Software Architecture Pattern(Mark Richards)笔记

    软件架构模式 缺少规范架构的程序通常会变得紧耦合.脆弱.难以更改,缺少清晰的发展方向和愿景.这本小书用50多页介绍了常用的5种常见架构模式,相信不管是大牛还是萌新都会有所收获,特别是对我这种偏爱系统设 ...

  5. Architecture pattern & Architecture style

    Architecture pattern: context + problem -> solution Architecture style: solution part of architec ...

  6. design pattern factory method #Reprinted#

    引入人.工厂.和斧子的问题: (1),原始社会时,劳动社会基本没有分工,需要斧子的人(调用者)只好自己去磨一把斧子,每个人拥有自己的斧子,如果把大家的石斧改为铁斧,需要每个人都要学会磨铁斧的本领,工作 ...

  7. Java Design Pattern(Factory,Singleton,Prototype,Proxy)

    一.Factory 设计模式: the most common pattern,create a new object ,eg. A a=new A();工厂模式的好处:工厂模式可以做到把创建对象单独 ...

  8. Design Pattern ->Factory Method

    Layering & Contract Philosophy With additional indirection Factory Method The example code is as ...

  9. Architecture Pattern: Publish-subscribe Pattern

    1. Brief 一直对Observer Pattern和Pub/Sub Pattern有所混淆,下面打算通过这两篇Blog来梳理这两种模式.若有纰漏请大家指正. 2. Role Publisher: ...

随机推荐

  1. Python Flask UnicodeDecodeError 编码错误解决

    折腾Python做快速Web开发.最后定下来用Flask,相对教程全面. utf8编码上遇到问题,所有文件已经是utf8编码保存,加载css.js等静态文件,如果用GBK编码就正常:用utf8就报Un ...

  2. [LeetCode] Range Sum Query - Immutable

    The idea is fairly straightforward: create an array accu that stores the accumulated sum fornums suc ...

  3. 转 mv 管道符

    需求:想列出指定的内容并将其转移到新的目录中 通过使用mv和管道符有几种方法, 1.file=`ls pattern`;mv $file newdir 2.ls pattern|xargs -i mv ...

  4. 安卓TTS语音合成经验分享(科大讯飞语音+)集成

    应用场景:足浴软件,技师钟房安排调派和队列排序查看,语音播报提醒.老程序是使用双屏显卡,windows系统PC上运行一个无人值守桌面程序.如今安卓机顶盒(WIFI)和MINI电视棒通过HDMI接口和支 ...

  5. python 字符串长度

    通过内置方法len()来计算字符串的长度,注意这个计算的是字符的长度. aa = 'afebb'bb = '你'print len(aa)print len(bb)

  6. [转]VS2005/2008过期之后简单实用的升级方法

    网络上有不少key,但是用了之后没效果,发现了一个好方法可以解决.  把\vs\setup\下面的 setup.sdb文件用文本编辑器打开,然后改动其最后的一行([Product Key] 下面的一行 ...

  7. 【解析 . PPT版】干货:阿里全息大数据构建与应用(包括:互联网金融、互联网+、精准营销...)

    作者:毛波,阿里巴巴资深数据专家,阿里数据管理平台(DMP)产品负责人. 摘要: 回顾传统数据仓库.商业智能到大型分布式数据平台的进化历程,深入阐述阿里的数据发展历史和数据观,以阿里DMP平台为例深入 ...

  8. Transactional replication 的Snapshot 文件在什么情况下会被清除

    Snapshot agent负责收集publication database的信息,将article的内容存储在snapshot文件中.而distribuiton cleanup job(后文简称清除 ...

  9. 爬虫技术 -- 基础学习(五)解决页面编码识别(附c#代码)

    实现从Web网页提取文本之前,首先要识别网页的编码,有时候还需要进一步识别网页所使用的语言.因为同一种编码可能对应多种语言,例如UTF-8编码可能对应英文或中文等语言. 识别编码整体流程如下: (1) ...

  10. TF-IDF 简介

      假设我们手头有大量的文档(或网页), 通常我们会比较关心以下几个问题: 1. 每一个文档的关键词(或主题词)包括哪些? 2. 给定一个(或一组)关键词,与这个(或组)词最相关的文档是哪一个? 3. ...