[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 ...
随机推荐
- “远程调试监视器(MSVSMON.EXE)似乎没有在远程计算机上运行“的完美解决方案
今天调试程序时,Visual Studio突然报出了如下错误: Microsoft Visual Studio 远程调试监视器(MSVSMON.EXE)似乎没有在远程计算机上运行.这可能是因为防火墙阻 ...
- 使用Javascript来创建一个响应式的超酷360度全景图片查看幻灯效果
360度的全景图片效果常常可以用到给客户做产品展示,今天这里我们推荐一个非常不错的来自Robert Pataki的360全景幻灯实现教程,这里教程中将使用javascript来打造一个超酷的全景幻灯实 ...
- php 碎片笔记
1.修改 php.ini 加载路径 添加环境变量 ,新建系统变量 PHPRC ,配置如下: 检验: 通过phpinfo(),查看系统配置 Loaded Configuration File ,识别系统 ...
- js深拷贝和浅拷贝
一.数组的深浅拷贝 在使用JavaScript对数组进行操作的时候,我们经常需要将数组进行备份,事实证明如果只是简单的将它赋予其他变量,那么我们只要更改其中的任何一个,然后其他的也会跟着改变,这就导致 ...
- 读书笔记_Effective_C++_条款四十四:将与参数无关的代码抽离template
标题上说“将与参数无关的代码抽离template”,这里的参数既可以指类型,也可以是非类型,我们先来看看非类型的情况. 假定我们要为矩阵写一个类,这个矩阵的行列元素个数相等,是一个方阵,因而我们可以对 ...
- SmartDoc(YUIDoc) 注释编写
上面介绍了JS文档和Demo生成工具SmartDoc,本篇开始介绍一下注释的编写.SmartDoc使用的是YUIDoc的引擎,所以的注释规则都一样,先简单介绍下YUIDoc的注释编写. 编写注释是一个 ...
- PerfMap – 显示前端网站性能的热力图插件
PerfMap 是用来分析前端性能,基于资源定时 API 生成网页资源加载的前端性能热图.热图的颜色和第一个毫秒值指示在什么时候页面的图像加载完毕,这是用户体验的一个很好的指标.括号中的第二个值是浏览 ...
- 编码神器——Sublime Text 包管理工具及扩展大全
Sublime Text 是程序员们公认的编码神奇,拥有漂亮的用户界面和强大的功能,例如代码缩略图,多重选择,快捷命令等.还可自定义键绑定,菜单和工具栏.Sublime Text 的主要功能包括:拼写 ...
- mysql根据身份证信息来获取用户属性信息
需要:根据身份证信息来获取用户属性 方法:可以使用如下sql语句: ) ' then '北京市' ' then '天津市' ' then '河北省' ' then '山西省' ' then '内蒙古自 ...
- Sql Server来龙去脉系列 必须知道的权限控制核心篇
最近写了<Sql Server来龙去脉系列 必须知道的权限控制基础篇>,感觉反响比较大.这可能也说明了很多程序猿对数据库权限控制方面比较感兴趣,或者某些技术点了解的没有很透彻. 有些人看 ...