Java 应用程序的服务定位器的替代品,应该是可扩展的
我正在做一个游戏,它有不同的物品,它们都有不同的行为。所有物品都可以通过为物品的不同方面购买不同的升级来改进。我将玩家的数据保存在MongoDB中。此数据包括一个文档数组。每个文档表示一个项目,并且至少包含一个包含项目名称的字符串。这使得识别类型并在玩家想要使用时实例化该类型的对象成为可能 我的计划是使用某种服务定位器将名称映射到特定项目的工厂。在阅读了遍布StackExchange的许多类似问题后,我了解到服务定位器通常被认为是一种反模式 现在出现的问题是:我应该怎么做?我计划将项目移出核心并创建不同的扩展包,这将添加新项目。这些将被添加到服务定位器中,因此我需要它或它的一个好的替代品 我的案例是不是服务定位器不是应该避免的坏反模式的特殊案例之一,或者即使在这种使用中它也被认为是坏的实践?我可能的替代方案是什么 谢谢你的帮助 编辑 示例 澄清给定情况的一些附加信息: 有不同的项目与不同的能力,作为一个例子,我将使用我发现的最简单的一个。这个物品使用时会射出一些炸药。这些炸药击中物体时会爆炸。该项目具有以下方面,可以升级:Java 应用程序的服务定位器的替代品,应该是可扩展的,java,design-patterns,service-locator,Java,Design Patterns,Service Locator,我正在做一个游戏,它有不同的物品,它们都有不同的行为。所有物品都可以通过为物品的不同方面购买不同的升级来改进。我将玩家的数据保存在MongoDB中。此数据包括一个文档数组。每个文档表示一个项目,并且至少包含一个包含项目名称的字符串。这使得识别类型并在玩家想要使用时实例化该类型的对象成为可能 我的计划是使用某种服务定位器将名称映射到特定项目的工厂。在阅读了遍布StackExchange的许多类似问题后,我了解到服务定位器通常被认为是一种反模式 现在出现的问题是:我应该怎么做?我计划将项目移出核心并
- 弹药:在我需要重新装弹之前我有多少发子弹
- 冷却:使用完所有弹药后,我必须等待给定的时间,直到物品再次可用
- 半径:爆炸周围其他玩家受到伤害的半径
- 伤害:玩家将受到的伤害
- 爆炸物:将发射多少枚爆炸物。它们将被分散开来,以便不是所有的都在同一地点
项
:
public interface Item<T extends Item<T>> {
// Get type of this item
public ItemType<T> getType();
// Serialize for database storage
public Map<String, Object> serialize();
// Get the player owning this item
public Player getOwner();
}
公共接口项{
//获取此项的类型
public ItemType getType();
//为数据库存储序列化
公共映射序列化();
//获取拥有此物品的玩家
公共播放器getOwner();
}
和ItemType
:
公共接口项类型{
//创建该类型的新项,并将所有内容设置为默认值
公共T constructionnewitem(Player);
//使用现有数据反序列化并创建项
公共T反序列化项(播放器,地图序列化);
//序列化数据库存储的升级列表
公共映射序列化();
//获取项目的名称
公共字符串getName();
}
我现在有了一个ItemRegistry*类,它管理一个映射,其中包含注册项的名称作为键,注册项作为值(
Map您的问题中确实没有足够的具体信息,任何人都无法给出更高层次的一般答案,当然也不足以选择具体的实现路径。您将不得不自己做一些工作来试验不同的体系结构(“计划扔掉[至少]一个”——弗雷德·布鲁克斯,神话中的人月)。谢谢你的提示,缺少什么信息?我应该解释整个系统并给出一些示例代码吗?对我来说,解释似乎解释了一切,但那是因为我知道我想做什么。要添加更多信息,你的问题听起来像我有一辆车。有时它有翅膀,有时它有轮子。我可以用扳手构建它吗?扳手是个好主意吗?
。不要试图让问题保持一般性。试着演示特定类型的项目的问题。展示它可以升级的内容以及升级与项目的关系。你很可能能够将答案应用于其他类型的对象。新信息如下:当然,希望它能有所帮助。我通常会尽量保持通用性,以使其对其他用户也有用,但有时这似乎不是一个正确的决定。您的问题中确实没有足够的具体信息,任何人都无法给出更高层次的一般答案,当然也不足以选择特定的实现你将不得不自己做一些工作来试验不同的架构(“计划扔掉(至少)一个”--弗雷德·布鲁克斯,神话中的人月)。谢谢你的提示,缺少什么信息?我应该解释整个系统并给出一些示例代码吗?对我来说,解释似乎解释了一切,但那是因为我知道我想做什么。要添加更多信息,你的问题听起来像我有一辆车。有时它有翅膀,有时它有轮子。我可以用扳手构建它吗?扳手是个好主意吗?
。不要试图让问题保持一般性。试着演示特定类型的项目的问题。展示它可以升级的内容以及升级与项目的关系。你很可能能够将答案应用于其他类型的对象。新信息如下:当然,希望它能有所帮助。我通常会尽量保持通用性,以使它对其他用户也有用,但有时这似乎不是一个正确的决定。
public interface ItemType<T extends Item<T>> {
// create a new item of that type with everything set to default values
public T constructNewItem(Player player);
// deserialize and create item with existing data
public T deserializeItem(Player player, Map<String, Object> serialized);
// Serialize upgrade lists for database storage
public Map<String, Object> serialize();
// Get the item's name
public String getName();
}