Java 中的注册表模式:为 Java 对象实现集中式控制机制
注册表设计模式的意图
注册表设计模式将创建和管理一组全局对象的职责集中起来,提供一个单一访问点,并确保受控实例化。
带有实际例子详细解释注册表模式
现实世界中的例子
在大型公司中,管理 IT 资产(如笔记本电脑、台式机、服务器和软件许可证)可能很困难。为了简化此过程,公司使用集中式 IT 资产管理系统,该系统充当注册表。
- 该系统为注册、跟踪和检索所有 IT 资产的信息提供了一个单一访问点。
- 采购新设备或软件时,将在系统中注册其详细信息,例如序列号、购买日期、保修期和分配的用户。
- IT 人员可以查询系统以获取有关任何资产的详细信息,检查其当前状态,并在需要时更新信息。
- 这种集中式管理促进了资产的有效利用和维护,确保了软件许可证的合规性,并有助于规划升级或更换。
在这个类比中,IT 资产管理系统充当注册表,管理生命周期,并为组织内的 IT 资产提供全局访问信息。
通俗地说
注册表是一个众所周知的对象,其他对象可以使用它来查找常用对象和服务。
注册表是一个全局的从键到对象的关联,允许从任何地方访问这些对象。它涉及两种方法:一种接受键和对象并将对象添加到注册表中,另一种接受键并返回该键对应的对象。它类似于 MultitonPattern,但并不限制实例只能是注册表中的实例。
Java 中注册表模式的编程示例
注册表设计模式是一种在软件设计中常用的模式,其中对象被存储并提供对它们的全局访问点。当您需要管理全局对象集合、将对象的创建与使用分离、确保对象的受控生命周期以及避免对象的冗余创建时,这种模式特别有用。
首先,我们有 Customer
记录。它代表将存储在注册表中的对象。每个 Customer
都有一个 id
和一个 name
。
public record Customer(String id, String name) {
@Override
public String toString() {
return "Customer{"
+ "id='" + id + '\''
+ ", name='" + name + '\''
+ '}';
}
}
接下来,我们有 CustomerRegistry
类。这个类是实际的注册表,Customer
对象存储在其中。它提供了添加和检索客户的方法。CustomerRegistry
是一个单例,这意味着应用程序中只有一个实例。
public final class CustomerRegistry {
@Getter
private static final CustomerRegistry instance = new CustomerRegistry();
private final Map<String, Customer> customerMap;
private CustomerRegistry() {
customerMap = new ConcurrentHashMap<>();
}
public Customer addCustomer(Customer customer) {
return customerMap.put(customer.id(), customer);
}
public Customer getCustomer(String id) {
return customerMap.get(id);
}
}
最后,我们有 App
类。这个类演示了如何使用 CustomerRegistry
。它创建了两个 Customer
对象,将它们添加到 CustomerRegistry
中,然后检索它们。
public class App {
private static final Logger LOGGER = LoggerFactory.getLogger(App.class);
public static void main(String[] args) {
CustomerRegistry customerRegistry = CustomerRegistry.getInstance();
var john = new Customer("1", "John");
customerRegistry.addCustomer(john);
var julia = new Customer("2", "Julia");
customerRegistry.addCustomer(julia);
LOGGER.info("John {}", customerRegistry.getCustomer("1"));
LOGGER.info("Julia {}", customerRegistry.getCustomer("2"));
}
}
在这个例子中,CustomerRegistry
为 Customer
对象提供了一个全局访问点。这使我们能够以集中方式管理这些对象,促进重用和共享,并促进组件之间的解耦。
运行示例会产生以下输出
09:55:31.109 [main] INFO com.iluwatar.registry.App -- John Customer{id='1', name='John'}
09:55:31.113 [main] INFO com.iluwatar.registry.App -- Julia Customer{id='2', name='Julia'}
何时在 Java 中使用注册表模式
- 当您需要管理全局对象集合时。
- 当您需要将对象的创建与使用分离时。
- 当您需要确保对象的受控生命周期时,例如服务或资源。
- 当您想要避免对象的冗余创建时。
Java 中注册表模式的实际应用
- 在企业应用程序中管理数据库连接。
- 在模块化应用程序中提供一个中心位置来注册和检索服务或组件。
- 创建一个中心配置注册表,应用程序的各个部分可以访问该注册表。
注册表模式的优缺点
优点
在 Java 中采用注册表模式的主要优势
- 集中对象管理,使应用程序更易于维护。
- 促进对象的重用和共享,从而减少内存占用和初始化时间。
- 促进组件之间的解耦。
权衡取舍
- 如果实现效率不高,可能会成为瓶颈。
- 如果注册表设计没有容错性,可能会引入单点故障。
- 增加了管理对象生命周期的复杂性。
相关模式
- 单例:通常与注册表一起使用,以确保注册表只有一个实例。
- 工厂:用于封装从注册表检索对象时可能需要的实例化逻辑。
- 服务定位器:一个在意图和结构上类似的模式,通常与注册表互换使用。
- 依赖注入:提供了一种管理依赖关系的替代方法,有时可以取代注册表的需要。
- 多例:与注册表类似,因为它管理多个实例,但它是基于键进行管理的,确保每个键只有一个实例。