设计模式-注册模式

设计模式专栏


模式介绍

注册模式是一种设计模式,也称为注册树模式或注册器模式。这种模式的主要目的是为应用中经常使用的对象创建一个中央存储器来存放这些对象,通常通过一个只包含静态方法的抽象类来实现(或者通过单例模式)。

注册模式可以将已经创建好的对象挂载到某个全局可以使用的数组上,在需要使用的时候,直接从该数组上获取即可。这就好比一个“对象的电话簿”——储存并且能够取回对对象引用的登记簿。

这种模式解决了全局共享对象和交换对象的问题,使得任何地方都可以直接访问这些对象。因此,注册模式成为整个应用信息的决定性来源。

在这里插入图片描述

模式特点

注册模式(Register Pattern)是一种常见的设计模式,它提供了一种将对象注册到容器中的机制,并允许通过键值来查找和获取这些对象。这种模式在很多场景下都非常有用,例如实现插件机制、服务定位等。

优点:

  1. 灵活性:注册模式提供了很大的灵活性,因为它允许在运行时动态地添加或删除对象。这使得系统能够轻松地扩展和维护。
  2. 集中管理:所有对象都集中存储在容器中,方便统一管理和查找。
  3. 松耦合:使用注册模式可以实现模块间的松耦合,提高代码的可维护性和可复用性。
  4. 易于使用:对于使用者来说,通过键值来获取对象非常直观和方便。

缺点:

  1. 性能问题:由于需要动态地创建和销毁对象,以及进行查找操作,相对于直接实例化对象的方式,注册模式可能会引入额外的性能开销。
  2. 可扩展性问题:随着注册的对象的增加,容器可能会变得非常庞大和复杂,导致维护困难。
  3. 键值冲突:如果多个对象使用了相同的键值进行注册,那么在获取对象时会造成冲突。
  4. 依赖管理:注册模式可能导致依赖关系的管理变得复杂化,因为所有依赖关系都集中在一个容器中。

在这里插入图片描述

应用场景

注册模式的应用场景包括:

  1. 插件机制:应用程序通常有一些固定的功能模块,而插件可以在这些功能模块的基础上进行扩展,为应用程序提供更多的功能。通过注册模式,我们可以将应用程序中的各个功能模块、插件统一管理,从而提高应用程序的可维护性和扩展性。
  2. 服务定位:在微服务的架构中,服务之间需要进行相互调用。为了解决不同服务之间相互调用时需要知道对方地址的问题,可以使用服务注册发现中心组件。开发的服务需要先注册到服务注册中心,服务消费者就可以从注册中心查询并选择需要的服务进行调用。
  3. 模块化的程序设计:通过注册模式,我们可以将应用程序中的各个模块、子系统相互依赖,从而进行模块化的程序设计。在这种设计模式下,我们可以使用抽象工厂类来实现不同的模块、子系统之间的通信和协调,通过注册模式,将各个模块、子系统实例注册到工厂类中,通过工厂类来创建和管理这些实例对象。
  4. API Gateway层API注册机制:API网关层提供API的注册,通过APIPortal提供API集市,通常适合有OpenAPI需求的场景,安全性方面要求相对比较高。对内也可以通过API管理工具提供API服务,特别是集团性公司的IT、数据生态体系建设。

此外,注册模式还可以用于实现跨集群的注册发现方案等。

在这里插入图片描述

注册式模式和策略模式有什么区别

注册模式和策略模式是两种不同的设计模式,它们有各自的特点和用途。

注册模式是一种将对象创建和管理集中化的模式,用户可以将对象注册到全局的注册器中,这些对象可以被应用程序中的任何地方访问。它的优点包括集中管理、避免重复创建、灵活扩展等。而策略模式则是处理算法和行为的可互换性的模式,它定义了一系列的策略,每个策略封装了一种特定的算法或行为。策略模式的核心思想是将算法或行为的实现延迟到运行时,用户可以根据需要选择不同的策略。

区别方面,注册模式主要关注对象的创建和管理,通过集中化的方式来管理对象的使用。而策略模式则关注算法和行为的可互换性,它允许在运行时根据需要选择不同的算法或行为。

在适用场景方面,注册模式适用于需要动态注册和查找对象的场景,例如插件机制、服务定位等。而策略模式则适用于需要根据不同情况选择不同算法或行为的场景,例如排序算法、渲染方式等。

注册模式和策略模式虽然都是设计模式,但它们解决的问题和应用场景不同。

在这里插入图片描述

代码示例

Java实现注册模式

在Java中,可以通过创建一个注册表类和一个注册对象类来实现注册模式。注册表类用于存储和管理注册对象,注册对象类则包含需要注册的信息。

以下是一个简单的Java实现示例:

// 注册对象类
public class RegisteredObject {
   
    private String name;
    private String type;

    public RegisteredObject(String name, String type) {
   
        this.name = name;
        this.type = type;
    }

    public String getName() {
   
        return name;
    }

    public String getType() {
   
        return type;
    }
}

// 注册表类
import java.util.HashMap;
import java.util.Map;

public class Registry {
   
    private Map<String, RegisteredObject> registry = new HashMap<>();

    public void register(String type, RegisteredObject obj) {
   
        registry.put(type, obj);
    }

    public RegisteredObject getRegisteredObject(String type) {
   
        return registry.get(type);
    }
}

在上面的代码中,我们定义了两个类:RegisteredObjectRegistryRegisteredObject类包含一个名称和一个类型,而Registry类则使用一个Map来存储和管理RegisteredObject实例。register方法用于将对象注册到注册表中,而getRegisteredObject方法则根据类型检索注册对象。

Python实现注册模式

在Python中,实现注册模式可以使用字典(dict)和装饰器(decorator)等语言特性。以下是一个简单的Python实现示例:

# 注册对象类
class RegisteredObject:
    def __init__(self, name, type):
        self.name = name
        self.type = type

    def get_name(self):
        return self.name

    def get_type(self):
        return self.type

# 注册表类
class Registry:
    def __init__(self):
        self.registry = {
   }

    def register(self, type, obj):
        self.registry[type] = obj

    def get_registered_object(self, type):
        return self.registry.get(type)

在上面的代码中,我们定义了两个类:RegisteredObjectRegistryRegisteredObject类包含一个名称和一个类型,而Registry类则使用一个字典来存储和管理RegisteredObject实例。register方法用于将对象注册到注册表中,而get_registered_object方法则根据类型检索注册对象。

在这里插入图片描述

注册模式在spring中的应用

在Spring框架中,注册模式的应用主要体现在Spring的IoC容器中。IoC容器负责管理Bean的生命周期,包括创建、配置、组装和管理Bean。

在Spring中,通过XML配置文件或注解的方式,可以将Bean注册到IoC容器中。IoC容器会根据配置信息创建相应的Bean实例,并通过依赖注入的方式将它们组装起来。

通过注册模式,Spring框架实现了对Bean的集中管理和控制,使得应用程序的配置更加灵活和可维护。同时,Spring框架还提供了丰富的扩展点,允许开发者自定义Bean的创建、配置和管理方式,进一步提高了Spring框架的灵活性和可扩展性。

注册模式在Spring框架中扮演着重要的角色,使得Spring能够实现灵活、可扩展的应用程序开发。

在这里插入图片描述

设计模式-策略模式

设计模式-多例模式

设计模式-命令模式

相关推荐

  1. 设计模式-模板方法模式

    2024-01-18 23:12:03       66 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-18 23:12:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-18 23:12:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-18 23:12:03       82 阅读
  4. Python语言-面向对象

    2024-01-18 23:12:03       91 阅读

热门阅读

  1. Docker Swarm网络管理

    2024-01-18 23:12:03       49 阅读
  2. 阿里巴巴中国站获得1688商品详情 API

    2024-01-18 23:12:03       52 阅读
  3. Linux常用命令2

    2024-01-18 23:12:03       54 阅读
  4. golang学习-goroutine

    2024-01-18 23:12:03       51 阅读
  5. postgresql.conf 详解

    2024-01-18 23:12:03       60 阅读
  6. Midjourney

    2024-01-18 23:12:03       65 阅读
  7. Vue3封装可拖拽的弹窗

    2024-01-18 23:12:03       50 阅读
  8. [go] 抽象工厂模式

    2024-01-18 23:12:03       47 阅读
  9. QT基础篇(10)QT5网络与通信

    2024-01-18 23:12:03       55 阅读
  10. element plus自定义组件表单校验

    2024-01-18 23:12:03       61 阅读
  11. C# Math.Floor与Math.Round

    2024-01-18 23:12:03       55 阅读
  12. html中flex的使用

    2024-01-18 23:12:03       53 阅读