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

下载
范例程序代码:点此下载
[Architecture Pattern] Factory Builder的更多相关文章
- [Architecture Pattern] Singleton Locator
[Architecture Pattern] Singleton Locator 目的 组件自己提供Service Locator模式,用来降低组件的耦合度. 情景 在开发系统时,底层的Infrast ...
- [Architecture Pattern] Repository实作查询功能
[Architecture Pattern] Repository实作查询功能 范例下载 范例程序代码:点此下载 问题情景 在系统的BLL与DAL之间,加入Repository Pattern的设计, ...
- [Design Pattern] Factory Pattern 简单案例
Factory Pattern , 即工厂模式,用于创建对象的场景,属于创建类的设计模式 . 下面是一个工厂模式案例. Shape 作为接口, Circle, Square, Rectangle 作为 ...
- Software Architecture Pattern(Mark Richards)笔记
软件架构模式 缺少规范架构的程序通常会变得紧耦合.脆弱.难以更改,缺少清晰的发展方向和愿景.这本小书用50多页介绍了常用的5种常见架构模式,相信不管是大牛还是萌新都会有所收获,特别是对我这种偏爱系统设 ...
- Architecture pattern & Architecture style
Architecture pattern: context + problem -> solution Architecture style: solution part of architec ...
- design pattern factory method #Reprinted#
引入人.工厂.和斧子的问题: (1),原始社会时,劳动社会基本没有分工,需要斧子的人(调用者)只好自己去磨一把斧子,每个人拥有自己的斧子,如果把大家的石斧改为铁斧,需要每个人都要学会磨铁斧的本领,工作 ...
- Java Design Pattern(Factory,Singleton,Prototype,Proxy)
一.Factory 设计模式: the most common pattern,create a new object ,eg. A a=new A();工厂模式的好处:工厂模式可以做到把创建对象单独 ...
- Design Pattern ->Factory Method
Layering & Contract Philosophy With additional indirection Factory Method The example code is as ...
- Architecture Pattern: Publish-subscribe Pattern
1. Brief 一直对Observer Pattern和Pub/Sub Pattern有所混淆,下面打算通过这两篇Blog来梳理这两种模式.若有纰漏请大家指正. 2. Role Publisher: ...
随机推荐
- C# 实现字符串去重
方法一 注:需要.net 3.5框架的支持 string s = "101,102,103,104,105,101,102,103,104,105,106,107,101,108" ...
- 为Ubuntu笔记本电脑设置WiFi热点共享上网
该文由土木坛子转译而来,说是转译,其实看截图就可以方便的设置,没有任何命令,全是图形界面,方便容易.我们都知道怎样在 windows 7 系统上如何设计 Wifi 热点,当你只有一条网线,多台计算机的 ...
- CSS3动画进度条
CSS3动画进度条 CSS CODE: @-webkit-keyframes move{ 0%{ background-position: 0 0; } 100%{ background-posi ...
- Java框架篇---Mybatis 构建SqlSessionFactory
从 XML 中构建 SqlSessionFactory 基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的.SqlSessionFactory 的实例可以通过 ...
- iOS开发中一些常见的并行处理(转)
本文主要探讨一些常用多任务的最佳实践.包括Core Data的多线程访问,UI的并行绘制,异步网络请求以及一些在运行态内存吃紧的情况下处理大文件的方案等. 其实编写异步处理的程序有很多坑!所以,本文 ...
- Intel HAXM安装错误处理:(TV-x) is not turned on
Android x86模拟器Intel Atom x86 System Image时提示Intel execute disable bit(xd) is not turned on 运行Elicpse ...
- NGUI 界面自适应
关于 NGUI 的界面自动适应不同的手机分辨率,网上已经够多的了.如果你点进了这个网页,推荐一下这一篇吧: http://www.xuanyusong.com/archives/2536 下面是我自己 ...
- NopCommerce插件学习
在园子里看到这篇文章:http://www.cnblogs.com/haoxinyue/archive/2013/06/06/3105541.html写的非常好,我也是在此文章的基础上来一步步的学习N ...
- Yii中 RBAC(基于角色的访问控制权限)表结构原理分析
这里有几个概念很重要,我简单用大白话说一下; 权限:就是指用户是否可以执行哪些操作. 如:小张可以发帖.回帖.浏览,小红只能回帖.浏览 角色:就是上面说的一组操作的集合. 如:高级会员有发帖.回帖.删 ...
- Android 学习笔记之Volley(七)实现Json数据加载和解析...
学习内容: 1.使用Volley实现异步加载Json数据... Volley的第二大请求就是通过发送请求异步实现Json数据信息的加载,加载Json数据有两种方式,一种是通过获取Json对象,然后 ...