[Architecture Pattern] Singleton Locator
[Architecture Pattern] Singleton Locator
目的
组件自己提供Service Locator模式,用来降低组件的耦合度。
情景
在开发系统时,底层的Infrastructure Context、或是核心的Domain Context这些共享对象生成之后,会在系统的许多地方被使用。为了减少共享对象初始生成、参考传递所造成的困扰,可以在系统内套用Service Locator模式,提供统一的静态参考点来生成、存取这些共享对象。
Service Locator参考数据
Service Locator对象结构
Service Locator模式确实减少共享对象初始生成、参考传递所造成的困扰,但在实作的过程中却会发现Service Locator模式,很容易为系统中的组件引入额外相依性。以下列这个范例项目来说,Client对象经由ServiceLocator对象,取得DataContext对象在执行过程中存取数据。
物件图
在实作的过程中为了能够重用程序代码,通常会将ServiceLocator对象封装为Infrastructure组件内容,而DataContext对象封装成为Domain组件内容、Client对象则是封装为Host组件。
组件图
一般来说Infrastructure组件内会包含许多基础对象,不会单纯只封装ServiceLocator对象。当这些基础对象引用其他参考时,也就是间接的增加了Host组件的相依性、增加了Host组件对于其他组件的耦合。
组件图
这时可以考虑将ServiceLocator对象设计为独立组件,让组件里只包含一个对象以避免不必要的相依性。但是当这样的设计一多的时候,很容易就会让组件的设计过于破碎。
组件图
为了降低组件耦合的问题,回过头思考Client对象、DataContext对象、ServiceLocator对象三者之间的关系。会发现Client对象需要的是ServiceLocator对象所提供的对象生成、静态参考等功能,而不是真的需要一个ServiceLocator对象。
这时开发人员可以将ServiceLocator对象所提供的对象生成、静态参考等功能,建立在DataContext对象自己本身之上,透过DataContext对象自己提供对象生成、静态参考等功能。也就是说经由这样的设计,将ServiceLocator对象从系统中移除、也就是把Infrastructure组件从系统中移除,进而降低了Host组件的相依性、降低了Host组件对于其他组件的耦合。
组件图
结构
物件图
参与者
Service
提供自身服务功能。
提供自身静态参考,用于参考定位、外部生成。
提供自身生成功能,用于内部生成。
Client
使用Context功能的对象。
外部生成的使用情景中,生成Context并且注入Context静态参考。
合作方式
外部生成
内部生成
(为了简化说明,Service生成模式采用直接建立的方式来示意。实际项目可以采用各种IoC Framework来做生成注入,或是套用各种Factory pattern,这些都能提高Service的重用性。)
实作
类别图
Service
public partial class Service
{
// Locator
private static Service _current; public static Service Current
{
get
{
if (_current == null)
{
_current = new Service("内部生成");
}
return _current;
}
set
{
_current = value;
}
}
} public partial class Service
{
// Constructors
public Service(string message)
{
// Arguments
this.Message = message;
} // Properties
public string Message { get; set; } // Methods
public void Execute()
{
Console.WriteLine(this.Message);
}
}
外部生成
class Program
{
static void Main(string[] args)
{
// Init
Init(); // Execute
Service.Current.Execute();
Console.WriteLine(); // End
Console.WriteLine("End...");
Console.ReadLine();
} static void Init()
{
// Service
Service.Current = new Service("外部生成");
}
}
内部生成
class Program
{
static void Main(string[] args)
{
// Init
Init(); // Execute
Service.Current.Execute();
Console.WriteLine(); // End
Console.WriteLine("End...");
Console.ReadLine();
} static void Init()
{
// Service }
}
(为了简化说明,Service生成模式采用直接建立的方式来示意。实际项目可以采用各种IoC Framework来做生成注入,或是套用各种Factory pattern,这些都能提高Service的重用性。)
下载
范例程序代码:点此下载
[Architecture Pattern] Singleton Locator的更多相关文章
- [Architecture Pattern] Factory Builder
[Architecture Pattern] Factory Builder 目的 同时提供延迟注入对象.挂载注入项目这两个功能 情景 在开发系统时,如果需要在运行时间才生成并注入对象,可以套用Fac ...
- [Architecture Pattern] Repository实作查询功能
[Architecture Pattern] Repository实作查询功能 范例下载 范例程序代码:点此下载 问题情景 在系统的BLL与DAL之间,加入Repository Pattern的设计, ...
- Design Pattern —— Singleton
Design Pattern —— Singleton 强力推荐枚举和类级内部类方式实现单例模式 单例模式是开发中非常常用的一种模式,简单的说,我们希望一个类永远都只有一个对象. 主要有两个用途: ...
- [Design Pattern] Service Locator Pattern 简单案例
Service Locator Pattern,即服务定位模式,用于定位不同的服务.考虑到 InitialContext::lookup 的成本比较高,提供了 Cache 类缓存以定位到的服务. 代码 ...
- [Design Pattern] Singleton Pattern 简单案例
Singleton Pattern, 即单例模式,用于获取类的一个对象,该对象在整个应用中是其类的唯一对象.单例模式属于创建类的设计模式. SingleObject 作为单例类,内含了一个静态私有的 ...
- Software Architecture Pattern(Mark Richards)笔记
软件架构模式 缺少规范架构的程序通常会变得紧耦合.脆弱.难以更改,缺少清晰的发展方向和愿景.这本小书用50多页介绍了常用的5种常见架构模式,相信不管是大牛还是萌新都会有所收获,特别是对我这种偏爱系统设 ...
- Architecture pattern & Architecture style
Architecture pattern: context + problem -> solution Architecture style: solution part of architec ...
- (Design Pattern) Singleton.
Role: The purpose of the Singleton pattern is to ensure that there is only one instance of a class, ...
- Design Pattern - Service Locator Pattern--转载
原文地址:http://www.tutorialspoint.com/design_pattern/service_locator_pattern.htm The service locator de ...
随机推荐
- Oracle10g新特性——正则表达式 - 转
在进行查询时,有时候需要按照一定的特殊规则来查找某个字符串,比如,你可能需要查询第三位为5-8,最后四位为’8888’的所有电话.在9i之前,你可能需要写一个很复杂的条件:Select usernam ...
- windows 程序设计自学:添加图标资源
#include <windows.h> #include "resource.h" LRESULT CALLBACK MyWndProc( HWND hwnd, // ...
- CSS基础(一):开篇
背景 HTML是一种超文本标记语言,用来定义文档的结构和内容,例如标题.段落和列表等等,而文档内容如何渲染.如何展示,这就需要样式来修饰了.CSS正是可以与HTML很好地结合.如果将HTML比作水,那 ...
- 国行手机安装GOOGLE PLAY
原文地址:http://blog.sina.com.cn/s/blog_68cff87b0101a96k.html 相信国行的手机都是没有google Play 功能的吧,相比其它国外的手机,功能上逊 ...
- CI 框架去掉url 中index.php的方法
1 修改 apache 的 httpd.conf 文件 #LoadModule rewrite_module modules/mod_rewrite.so 去掉前面的# 2 找到 你程序目录下的 .h ...
- PL/SQL异常
CASE_NOT_FOUND CASE selector WHEN selector_value_1 THEN statements_1 WHEN selector_value_2 THEN stat ...
- spring 启动流程
AbstractApplicationContext 分析 启动流程 // Prepare this context for refreshing.prepareRefresh(); 1. // In ...
- 指定的参数已超出有效值的范围 参数名: utcDate WebResource异常
指定的参数已超出有效值的范围.参数名: utcDate 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息 ...
- 比较几种工具Python(x,y) Anaconda WinPython
浏览了一些相关的论坛,将几大工具的特点分别总结下: Python(x,y) 更新很慢,稳定性一般,默认带有很多包. WinPython 只能在windows上跑,界面友好,和Python(x,y)是 ...
- maven -- 问题解决(一)解决eclipse中maven项目出现的问题
配置项目时出现的错误: error: Cannot change version of project facet Dynamic Web Module to 2.5. error: One or m ...