Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 组合与多个单件_Java_Design Patterns_Architecture - Fatal编程技术网

Java 组合与多个单件

Java 组合与多个单件,java,design-patterns,architecture,Java,Design Patterns,Architecture,我正在写一个桌面MMO游戏,我想咨询一下架构问题。我有诸如NetworkManager、ClientWindow、CachingTextureAtlas之类的类,它们只在游戏的一个实例中需要,我的问题是:将它们设置为单例是否正确?如果是的话,这将是一种通过全局类的交互,从设计的角度来看,这对我来说是不好的,如果不是的话,我们将把它们组成一个门面,我们将不得不把它们全部传递给太多类的构造函数,这也不方便。什么是更好的选择?单例应该小心使用,几乎永远不要。我见过很多地方,最近的sceanrio是hi

我正在写一个桌面MMO游戏,我想咨询一下架构问题。我有诸如NetworkManager、ClientWindow、CachingTextureAtlas之类的类,它们只在游戏的一个实例中需要,我的问题是:将它们设置为单例是否正确?如果是的话,这将是一种通过全局类的交互,从设计的角度来看,这对我来说是不好的,如果不是的话,我们将把它们组成一个门面,我们将不得不把它们全部传递给太多类的构造函数,这也不方便。什么是更好的选择?

单例应该小心使用,几乎永远不要。我见过很多地方,最近的sceanrio是hibernate会话工厂,最初我们认为单个实例应该可以,但后来遇到了多实例的情况,并最终重构了代码。 另一个问题是,如果您正在为代码编写单元测试,那么对于所有依赖于这些单例类的类来说,这将是一场噩梦


其中一个解决方案可能是注入一种工厂,它可以为您提供这些实例/它提供一种间接方式并避免直接耦合。另一种方法是使用一个容器,例如pico容器,并将其作为构造函数依赖项注入,这也是您所指出的。

Singleton应该小心使用,几乎永远不要使用。我见过很多地方,最近的sceanrio是hibernate会话工厂,最初我们认为单个实例应该可以,但后来遇到了多实例的情况,并最终重构了代码。 另一个问题是,如果您正在为代码编写单元测试,那么对于所有依赖于这些单例类的类来说,这将是一场噩梦


其中一个解决方案可能是注入一种工厂,它可以为您提供这些实例/它提供一种间接方式并避免直接耦合。另一种方法是使用容器,例如pico容器,并将其作为构造函数依赖项注入,这也是您所指出的。

因此,您反对单例方法,并且建议创建一个包含所需类实例的工厂?还是每次都提供一个新实例?我在服务器端使用Spring DI,我会考虑从单子上移开,但是我们应该怎么做呢?在CachingTextureAtlas案例中,每次实例化它都非常昂贵,谢谢@还有弗拉基米尔,我更喜欢依赖注入。这将从调用它的方法中抽象实现。因此,您可以更改实现,并且很可能永远不必重构代码使用SpringDI,您总是可以说您想要单实例还是多实例Singleton vs protytype。Google guice或pico对spring来说都是相对轻量级的。@OneMoreVladimir也要注意你的单例的状态性,这是除了耦合之外的另一个大缺点。如果您经常发现自己拼命地调试一个单例来跟踪对它所做的状态修改,那么您可能需要单独的实例,而不是单例。从一开始就将你的单例设置为无状态和不可变将帮助你更快地了解它们的真正本质。因此你反对单例方法,你建议的是创建一个工厂来保存所需类的实例?还是每次都提供一个新实例?我在服务器端使用Spring DI,我会考虑从单子上移开,但是我们应该怎么做呢?在CachingTextureAtlas案例中,每次实例化它都非常昂贵,谢谢@还有弗拉基米尔,我更喜欢依赖注入。这将从调用它的方法中抽象实现。因此,您可以更改实现,并且很可能永远不必重构代码使用SpringDI,您总是可以说您想要单实例还是多实例Singleton vs protytype。Google guice或pico对spring来说都是相对轻量级的。@OneMoreVladimir也要注意你的单例的状态性,这是除了耦合之外的另一个大缺点。如果您经常发现自己拼命地调试一个单例来跟踪对它所做的状态修改,那么您可能需要单独的实例,而不是单例。让你的单身汉从一开始就是无状态和不可变的,这将帮助你更快地了解他们的真实本质。