java – 适用于全局数据访问和修改的设计

我确信这是经常出现的,但我不知道如何处理它,也不知道要搜索的相关术语.我正在为搜索引擎创建一个实用程序,它使用
Java将“启发式”附加到传入的搜索作业. (例如,如果用户搜索“沙发”,该实用程序将附加“沙发”和“卧室家具”等术语,以提供更相关的结果.)

我在处理全球信息方面遇到了一些麻烦.在这种特定情况下,启发式术语是可以由在后端工作的人修改的全局信息,或者可以由客户端使用搜索来访问.所以,我想知道在这种情况下最佳实践是什么:我可以创建一个几乎纯静态方法的类,称为HeuristicSearchEngine,可以在服务器启动开始时启动,将启发式加载到内存中,以及有可用于访问启发式搜索或修改术语的方法.这看起来很草率,因为它没有使用OOP的任何优点.因此,另一种方法是使用单例来创建当前启发式的实例.这样,无论何时启动搜索作业,作业都可以加载当前状态的实例,将启发式附加到搜索并继续.然而,单身人士在这里似乎不合适,我想知道其他人如何处理这个案子.

如果您想进一步澄清任何其他信息,请与我们联系.

最佳答案 您描述的单件/工厂方法功能强大且易于实现.但是单身人士很危险,因为如果你想在未来的道路上实施变种服务,你可能需要重构一些东西以适应它们.此外,单身人士通常会与静态工厂一起传递,这些工厂本身可能会影响可扩展性.

而不是单例/因子方法,考虑依赖注入.它实现起来比较麻烦,但扩展得更加优雅.

通过依赖注入,您可以预测组件对数据/服务的需求,并在需要之前将它们传递给依赖组件. (另一种方法是将数据/服务发现到该组件的工作 – 您可能通过静态工厂实现的功能.)通常,您需要对组件进行分离并隔离其功能;这样做通常被认为是一种有效的设计方法.

作为一个更具体的例子,不是你的servlet调用com.me.Herusitic#getInstance(),而是将一个Heuristic实例传递给它们的构造函数.该启发式引用保存在对象中,并根据需要调用.稍后,当您将Heuristic扩展为FancyHeuristic和FakeHeuristicForTesting并且您希望servlet使用它们时,您不需要修改您的servlet代码:只需传入新类型的启发式.使用工厂方法,您必须重写工厂逻辑.

这个答案只是触及了这一主题的表面.幸运的是,关于DI设计模式(StackOverflow和其他地方)的讨论都没有结束,所以我将留给你继续研究.

点赞