[Architecture Pattern] Singleton Locator

[Architecture Pattern] Singleton Locator

目的

组件自己提供Service Locator模式,用来降低组件的耦合度。

情景

在开发系统时,底层的Infrastructure Context、或是核心的Domain Context这些共享对象生成之后,会在系统的许多地方被使用。为了减少共享对象初始生成、参考传递所造成的困扰,可以在系统内套用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,布布扣,bubuko.com

时间: 2024-08-08 01:26:36

[Architecture Pattern] Singleton Locator的相关文章

Design Pattern Singleton 单一模式

单一模式的几个注意点: 一) 设计单一模式,首先需要把构造函数给私有化了,不让外界访问,那么外界只能通过提供的函数获取一个新的类. 二) C++的单一模式,记得要在类外初始化一个类,否则或内存出错的. 三) 这个唯一的类必须是要静态的 程序: #ifndef _SINGLETON_H #define _SINGLETON_H #include <iostream> #include <string> using namespace std; class DuGuJiuJian {

Design Pattern —— Singleton

Design Pattern —— Singleton   强力推荐枚举和类级内部类方式实现单例模式 单例模式是开发中非常常用的一种模式,简单的说,我们希望一个类永远都只有一个对象. 主要有两个用途: 1.存储一些进程内共享的值(不是很推荐,大部分情况下还是应该用局部变量,互相传递值的方式) 2.任何时候都不变的操作 单例模式的实现目前已知的有五种: 1.饿汉式 2.懒汉式 3.双重验证 4.类级内部类 5.枚举 一.饿汉式 类加载时就创建好对象,以空间换时间.这样外部调用EagerSingle

[Architecture Pattern] Repository实作查询功能

[Architecture Pattern] Repository实作查询功能 范例下载 范例程序代码:点此下载 问题情景 在系统的BLL与DAL之间,加入Repository Pattern的设计,能够切割BLL与DAL之间的相依性,并且提供系统抽换DAL的能力.但在软件开发的过程中,套用Repository Pattern最容易遇到的问题就是,如何在Repository中实作「查询」这个功能.像是在下列这个查询订单的页面,系统必须要依照用户输入的查询条件,来从DAL中查询出所有符合条件内容的

[Architecture Pattern] Factory Builder

[Architecture Pattern] Factory Builder 目的 同时提供延迟注入对象.挂载注入项目这两个功能 情景 在开发系统时,如果需要在运行时间才生成并注入对象,可以套用Factory模式来提供延迟注入对象功能.例如:一个监控系统在火警发生时,建立功能对象来启动相关设备(洒水设备.警报设备.警消通报). 物件图 但在实作过程中,延迟注入对象这个功能,常常需要伴随挂载注入项目功能,用以增加系统的延展性,这时可以接着套用Builder模式,来提供挂载注入项目功能.例如:一个监

[Design Pattern] Service Locator Pattern 简单案例

Service Locator Pattern,即服务定位模式,用于定位不同的服务.考虑到 InitialContext::lookup 的成本比较高,提供了 Cache 类缓存以定位到的服务. 代码实现 Service 接口 public interface Service { public String getName(); public void execute(); } Service1, Service2 实现 Service 接口,提供具体服务 public class Servic

[Design Pattern] Singleton Pattern 简单案例

Singleton Pattern, 即单例模式,用于获取类的一个对象,该对象在整个应用中是其类的唯一对象.单例模式属于创建类的设计模式. SingleObject 作为单例类,内含了一个静态私有的 SingleObject 成员变量,将构造方法私有化使得外部无法构造 SingleObject 的对象,同时提供一个公共的 getInstance 方法,提供唯一的对象. 代码实现: 单例类 SingleObject public class SingleObject { private stati

Design Pattern - Service Locator Pattern--转载

原文地址:http://www.tutorialspoint.com/design_pattern/service_locator_pattern.htm The service locator design pattern is used when we want to locate various services using JNDI lookup. Considering high cost of looking up JNDI for a service, Service Locato

Architecture Pattern: Publish-subscribe Pattern

1. Brief 一直对Observer Pattern和Pub/Sub Pattern有所混淆,下面打算通过这两篇Blog来梳理这两种模式.若有纰漏请大家指正. 2. Role Publisher:消息发布者,组装原始消息实体并触发消息传递的主体. Subscriber:消息订阅者,接收消息实体并作出响应的主体. Message Broker or Event Bus:消息发布者 与 消息订阅者 间的媒介,内含消息过滤和消息路由的功能,并可通过内置的消息队列(message queue)现实优

Design Pattern - Singleton

单例模式 定义:确保一个类只有一个实例,并提供一个全局访问点. 设计思路 私有化构造函数,使外界不能创建该类的实例 对外开放一个共有静态方法,用于并返回全局唯一实例. 示例代码(C#) /// <summary> /// 单例模式的实现 /// </summary> public class Singleton { private static Singleton m_Singleton; private static readonly object locker = new ob