设计模式-注册模式

发布时间:2023年12月27日
设计模式专栏


模式介绍

注册模式是一种设计模式,也称为注册树或注册器模式。这种模式将类的实例化和创建分离开来,避免在应用程序启动时实例化对象,以避免造成资源的浪费。

注册模式的核心思想是将类的创建和管理的代码封装到一个工厂类中,用户代码无需显式地通过“new”关键字实例化对象。相反,用户可以将类对象注册到全局的注册树上,这些对象就可以被应用程序中的任何地方访问。

使用注册模式的优势在于,它提供了一种集中管理对象的方式,避免了在每个需要使用对象的地方重复创建和销毁对象。此外,通过将对象的创建和销毁逻辑集中管理,可以更好地控制对象的生命周期,减少内存泄漏和性能问题。

此外,注册模式还可以与其他设计模式结合使用,例如与单例模式和工厂模式结合,以实现更加灵活和可扩展的对象创建和管理方式。

在这里插入图片描述

模式特点

  • 注册模式的优点包括:
  1. 集中管理 :注册模式将对象的创建和管理集中到一个地方,方便对对象进行统一管理和维护。
  2. 避免重复创建 :通过将对象注册到全局的注册树上,避免了在每个需要使用对象的地方重复创建和销毁对象,减少了资源浪费。
  3. 灵活扩展 :注册模式提供了注册和注销接口,方便用户动态添加或删除对象,使得应用程序更加灵活和可扩展。
  • 注册模式也存在一些缺点:
  1. 依赖管理 :注册模式需要管理对象的生命周期,因此需要谨慎处理对象的创建和销毁,避免出现内存泄漏等问题。
  2. 注册配置 :使用注册模式需要对每个对象进行注册配置,增加了开发的工作量。
  3. 性能开销 :虽然注册模式避免了重复创建对象,但在某些情况下,对象的创建和销毁仍然需要一定的性能开销。

因此,在使用注册模式时,需要根据实际情况进行权衡,并谨慎处理对象的生命周期和依赖关系。

在这里插入图片描述

应用场景

注册模式在以下场景中可能会得到应用:

  1. 插件扩展开发:在应用程序中,通常会有一些固定的功能模块,而插件可以在这些功能模块的基础上进行扩展,为应用程序提供更多的功能。通过注册模式,可以将应用程序中的各个功能模块、插件统一管理,从而提高应用程序的可维护性和扩展性。
  2. 模块化的程序设计:通过注册模式,开发者可以将应用程序中的各个模块、子系统相互依赖,从而进行模块化的程序设计。
  3. 跨集群注册发现:在多容器集群环境下,需要选择主备或者双活/多活模式,采用全容器注册或部署独立的注册发现中心,或者单一注册发现中心或每个集群都附属自己的注册发现中心,或者分层注册机制等。这种场景下,注册模式可以提供持续稳定的注册发现服务。
  4. API Gateway层API注册机制:API网关层提供API的注册,通过APIPortal提供API集市,通常适合有OpenAPI需求的场景,安全性方面要求相对比较高。

请注意,这些只是注册模式可能的应用场景,具体是否适用需要根据项目的具体需求和上下文来判断。

在这里插入图片描述

注册模式和单例模式的区别

注册模式单例模式是两种不同的设计模式,它们的主要区别在于实现方式和应用场景。

单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点。单例模式通常用于创建系统中只需要一个实例的类,例如日志记录器、配置管理器等。单例模式通过在类中实现一个私有静态实例,并在类中提供公共静态方法来获取该实例,从而实现全局访问点。

注册模式是一种结构型设计模式,它提供了一种将对象创建和使用分离的方式。注册模式通过将对象注册到全局的注册表中,使得应用程序中的任何地方都可以通过注册表来获取和使用对象。注册模式通常用于创建可配置、可扩展的系统,例如插件系统、服务注册和发现等。

总的来说,单例模式关注的是如何创建唯一的实例,并提供全局访问点;而注册模式关注的是如何管理对象的创建和使用,提供一种灵活、可扩展的对象创建和使用方式。

在这里插入图片描述

代码示例

Java实现注册模式

以下是一个简单的Java示例,展示了如何实现注册模式:

import java.util.HashMap;
import java.util.Map;

interface Service {
    void execute();
}

class ConcreteServiceA implements Service {
    public void execute() {
        System.out.println("ConcreteServiceA is executing.");
    }
}

class ConcreteServiceB implements Service {
    public void execute() {
        System.out.println("ConcreteServiceB is executing.");
    }
}

class Registry {
    private Map<String, Service> services = new HashMap<>();

    public void registerService(String name, Service service) {
        services.put(name, service);
    }

    public Service getService(String name) {
        return services.get(name);
    }
}

public class RegistrationPatternDemo {
    public static void main(String[] args) {
        Registry registry = new Registry();
        registry.registerService("serviceA", new ConcreteServiceA());
        registry.registerService("serviceB", new ConcreteServiceB());

        Service serviceA = registry.getService("serviceA");
        serviceA.execute(); // 输出: ConcreteServiceA is executing.

        Service serviceB = registry.getService("serviceB");
        serviceB.execute(); // 输出: ConcreteServiceB is executing.
    }
}

在这个示例中,我们定义了一个Service接口,以及两个实现了该接口的类ConcreteServiceAConcreteServiceB。我们还定义了一个Registry类,它使用一个Map来存储注册的服务。registerService方法用于注册服务,而getService方法用于根据名称获取服务。在main方法中,我们创建了一个Registry实例,注册了两个服务,并分别获取和执行它们。

Python实现注册模式

以下是一个Python实现注册模式的示例:

from abc import ABC, abstractmethod
from collections import defaultdict

class Service(ABC):
    @abstractmethod
    def execute(self):
        pass

class ConcreteServiceA(Service):
    def execute(self):
        print("ConcreteServiceA is executing.")

class ConcreteServiceB(Service):
    def execute(self):
        print("ConcreteServiceB is executing.")

class Registry:
    def __init__(self):
        self.services = defaultdict(list)

    def register_service(self, name, service):
        self.services[name].append(service)

    def get_service(self, name):
        return self.services.get(name, [])[0] if self.services.get(name) else None

# 创建注册器实例
registry = Registry()

# 注册服务
registry.register_service("serviceA", ConcreteServiceA())
registry.register_service("serviceB", ConcreteServiceB())

# 获取并执行服务
serviceA = registry.get_service("serviceA")
serviceA.execute()  # 输出: ConcreteServiceA is executing.

serviceB = registry.get_service("serviceB")
serviceB.execute()  # 输出: ConcreteServiceB is executing.

在这个示例中,我们定义了一个抽象基类Service,它包含一个抽象方法execute。然后,我们创建了两个实现了Service接口的类ConcreteServiceAConcreteServiceB。接下来,我们定义了一个Registry类,它使用一个字典来存储注册的服务。register_service方法用于注册服务,它将服务添加到字典中指定名称的列表中。get_service方法用于根据名称获取服务,它返回第一个注册的服务实例。在示例中,我们创建了一个Registry实例,注册了两个服务,并分别获取和执行它们。

在这里插入图片描述

注册模式在spring中的应用

Spring框架中使用了注册模式,主要是通过Spring的ApplicationContext来管理Bean。

Spring的ApplicationContext是一个接口,它实现了注册模式。在Spring中,Bean的创建和管理是通过ApplicationContext来完成的。当应用程序启动时,Spring会创建一个ApplicationContext实例,并将所有注册的Bean加载到该实例中。通过ApplicationContext,我们可以获取和操作这些Bean。

在Spring中,Bean的注册方式有多种,可以通过XML配置文件、注解或者JavaConfig类来实现。通过这些方式,我们可以将Bean定义并注册到Spring的容器中,并由Spring自动管理它们的生命周期和依赖关系。

在Spring中,注册模式的主要应用场景是解耦和模块化。通过将Bean注册到Spring容器中,我们可以将应用程序的不同模块解耦,使得它们之间相互独立,降低了代码的耦合度。同时,通过注册模式,我们可以实现插件化开发,使得应用程序可以根据需要动态添加或删除功能模块。

总之,Spring中的注册模式使得应用程序更加灵活、可扩展和可维护。

在这里插入图片描述

设计模式-迭代器模式

设计模式-责任链模式

设计模式-门面模式

文章来源:https://blog.csdn.net/zhangzehai2234/article/details/135233296
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。