何时使用哪种设计模式?

107

我非常喜欢设计模式,但是我发现很难辨别何时可以应用它们。我阅读了许多解释设计模式的网站。大多数我都能理解,但在我的实际情况中很难辨认出一个模式。

这就是我问这个问题的原因。是否有任何指南/警示信号来确定使用哪种设计模式。

例如,如果您正在使用switch语句来确定需要创建哪个对象,则可能要使用工厂模式。因此,在这种情况下,switch语句是使用工厂模式的“警报”。

那么,您知道更多用于确定设计模式的“警报”吗?


6
通常我看到的设计模式描述都包括了你想要使用该设计模式的情况描述。 - R. Martinho Fernandes
3个回答

100

通常情况是反过来的。不要去寻找可以使用设计模式的情况,而是寻找可以进行优化的代码。当你发现有结构不正确的代码时,请尝试找到能够解决问题的设计模式。

设计模式旨在帮助你解决结构性问题,不要为了使用设计模式而设计应用程序。


23
不仅存在结构性问题,还存在行为和创造性问题。 - DevDemon
1
设计模式可以通过提供经过测试、证明的开发范例来加速开发过程。有效的软件设计需要考虑到在实现过程中可能不会立即显现的问题。重用设计模式有助于防止可能导致重大问题的微妙问题,并提高对熟悉这些模式的程序员和架构师的代码可读性。 - SaddamBinSyed

5

学习它们,慢慢地你就能识别和找出何时使用它们。从单例模式开始,这很简单 :)

如果您想创建一个对象的一个实例并且只有一个,请使用单例模式。假设您正在制作一个带有选项对象的程序。您不希望有多个选项对象,那样很愚蠢。单例确保永远不会有多个实例。单例模式简单易用,被广泛使用,并且非常有效。


18
单例模式并不是仅在需要一个实例时使用的。单例模式适用于需要限制只有一个实例的情况。如果你确实只需要一个实例,那么可以尝试简单地创建一个实例并使用它。 - R. Martinho Fernandes
此外,虽然单例在某些地方非常有用和必要,但当不必要时,它也是一种非常容易实现的模式。正如你在这里暗示的,以及Fernandes指出的,你可能并不需要它。事实上,单例模式的使用往往是可能存在代码异味的一个很好的标志。将其用于服务类很可能是一种代码异味。听起来你需要依赖注入,而不是单例。有些人确实会这样使用它们。特别是对于小型(不重要)的代码或POC。但正如我所说,也有一些有效的用途。不要找到做某事的简单方法就去做。 - Suamere

4

我完全同意@Peter Rasmussen的观点。

设计模式提供了通用解决常见设计问题的方案。

我希望你能按照以下方法进行操作:

  1. 了解每种模式的意图
  2. 了解每种模式的清单或用例
  3. 想出解决你的问题的方案,并检查你的解决方案是否符合特定模式的清单
  4. 如果不符合,请忽略设计模式并编写自己的解决方案。

有用的链接:

sourcemaking :用多种语言(包括C++和Java)精美地解释了意图结构清单

维基百科:用多种语言(包括C#和Java)解释了结构、UML图和工作示例。

每个模式中的清单经验法则sourcemakding中提供了警报提示。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接