2012-01-30 32 views
4

我确定这是经常出现的内容,但我不知道如何处理它,也不知道要搜索的相关术语。我正在为一个搜索引擎创建一个实用程序,它将“启发式”附加到使用Java的传入搜索作业中。 (例如,如果用户搜索“沙发”,该实用程序将附加“沙发”和“卧室家具”等术语以提供更相关的结果。)针对全球数据访问和修改的正确设计

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

让我知道你是否想进一步澄清任何其他信息。

回答

2

您所描述的单件/工厂方法功能强大且易于实现。但是单身人士是危险的,因为如果你想在旅途中实施变种到你的herustics服务,你可能不得不重构一些东西来适应它们。此外,单身人士通常会使用静态工厂,而这些静态工厂本身可能会干扰可扩展性。

而不是单身/因素的方法,考虑依赖注入。实现起来更麻烦,但更加优雅。

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

作为一个更具体的例子,而不是你的小服务程序调用com.me.Herusitic#getInstance(),而是他们将有一个实例Heuristic传递给它们的构造函数。 Heuristic引用保存在对象中,并根据需要调用。稍后,如果将Heuristic扩展为FancyHeuristicFakeHeuristicForTesting,并且您希望servlet使用它们,则不需要修改您的servlet代码:只需传入新的启发式即可。采用工厂方法,您必须重新编写工厂逻辑。

这个答案只是抓住了这个话题的表面。幸运的是,关于DI设计模式(在StackOverflow和其他地方)都没有讨论过,所以我会留给你继续研究。

+1

感谢Cheeken的快速而详细的回应。我的印象是,这在编程中是一项微不足道的任务,但很高兴看到它们是这些观察背后的一些实际深度。 – Sal 2012-01-31 00:54:44