最常用的设计模式是什么?[关闭]


24

您认为哪种设计模式最受欢迎?


如果可能的话,两者都可以...
Tamara Wijsman

“切换而不是多态”?
mlvljr 2010年

@Bigown:然后您应该“接受”您最喜欢的答案。如果您不喜欢任何答案,请提供赏金。
Macneil

2
投票认为不具有建设性意义-基本上是一项民意调查。除非有人进行实证研究,否则答案都是猜测或最喜欢的(或最不喜欢的),而选票将反映出个人的情感。最终结果将是没有深度的设计模式列表。因此,不是建设性的。
Steven A. Lowe

@Steven:我很确定Jay在《 The Big Ball of Mud》中是对的。:-)
Tamara Wijsman

Answers:


39

我敢肯定,最常见的是“泥浆大球”。对我们所有人来说都是不幸的。
http://en.wikipedia.org/wiki/Big_ball_of_mud


同意,当您开始一个新项目时,所有内容都井井有条,并记录在案,但是随着截止日期的临近,一切都变得像泥泞的大球
Arturo Molina 2010年

3
@Arturo-那是一个可能的原因。其他:1)由经验不足的程序员启动的小项目,该项目出乎意料地成功,然后超出了最初的目的。2)缺乏经验的程序员被指派去维护的趋势,然后他们没有对原始体系结构的指导或理解,因此他们只是破解东西,并且随着系统的老化而变得更糟。3)团队使用了错误的技术或他们不熟悉的新技术,并且在新项目中使用的技术不佳,并且在截止日期之前出现了凹坑:)
杰伊2010年

1
大声笑-如果可以给您增加点数,我会的。优秀(和悲伤)的观察。
luis.espinal 2011年

25

MVC及其变体绝对是顶级设计模式之一。


2
我要说的是,OP的问题相当愚蠢(我仍然认为是)。但是,您的答案与IMO差不多。如果有一种模式(及其变体)被广泛使用,那就是这种模式。为您的好答案+1。
luis.espinal 2011年

21

如果您谈论的是四人行的设计模式,那我不得不说Singleton。这真是令人伤心的状态-几乎就像程序员听到设计模式的魔力,然后在第一个模式之后停下来一样。

如果您谈论的是建筑风格的模式(换句话说,跨越多个类或层的设计模式),我不得不说MVC。其他一些流行的是存储库模式和service-locator


2
当您考虑到许多人将Singleton视为反模式时,这甚至更可悲!
RichardOD

1
@RichardOD,难过人们在不使用它时就将其视为一个,还是在人们将其用作反模式时却在难过地使用?
Matt Olenik 2010年

我的意思是这么受欢迎很可悲-似乎是采访中的最爱。上次接受采访时,有人问我如何编写Singleton,我的回答是我不会使用Unity这样的IoC容器来为我处理。
RichardOD

@RichardOD-不是单例它被认为是反模式。它的滥用用法是一种反模式。实际上很少有需求/需要单例的情况,在具有控制资源粒度的容器的环境中,甚至不需要它们。例如,当您在现代Java代码库中看到单例时,这通常是反模式用法的红旗(不在单例模式本身上。)
luis.espinal 2011年

@Jaco-我和你会有不同的看法。我认为组合,策略和模板(以及它们的多个转世)已经变得比单例流行得多,尤其是因为在过去十年左右的时间里,我们一直专注于继承的结构组成。
luis.espinal 2011年


7

装饰器

通过组合在运行时向对象添加功能。我个人的最爱。

编辑:另外工厂可能是最常见的之一。


5

正面

考虑一下任何REST接口,例如Twitter或SO API。它隐藏了很多后端的东西,至少在Twitter的情况下,它们可能非常复杂。

我是否关心@apklusk的tweets存储在哪些数据库表中?而且它具有快速缓存?那@shemnon的读者群如此之低,这些tweet总是没用?那就是立面的魔力。


5

策略模式

如果您曾经使用过依赖注入,那么您将使用策略模式。


除了模板和组合(以及它们的多个变体和组合)之外,商定了策略
luis.espinal 2011年

5

为什么还没有人提到迭代器?尤其是对于构成复杂数据结构的所有地图……这是我使用最多的地图。还是我们在谈论我们重新实现的模式?


3

我感到惊讶的是,没有人提到Factory模式,根据我的经验,这是其中最常用(也是最滥用)的模式之一。如果不是第一,可能单身人士应该是第一,我以为这将是紧随其后的第二。


3

除了我以前的回答,我还要添加一个今天从继承的项目中遇到的新问题:

复制粘贴

在调试时,我遇到了一段代码,调用了2个名称相似的函数:

if(x)
   Func1
else
   Func2

Func1和Func2具有相同的参数。我将它们拉出并进行了扩散,它们完全相同,除了Func1称为Func3和Func2称为Func4。我把那些拉出来,并与他们区分开。100%相同,除了1行。因此,以前的程序员决定将两个50行嵌套的函数复制并粘贴到恰好在1个地方使用的2个私有函数中,而不是添加标志参数。这让我想哭。


2

在谈论四人行的设计模式时,我想不出一个不使用观察者模式的程序。而且,正如Jaco所述,Singleton也被广泛使用,不幸的是,它已经成为一个锤子(即使不是完全需要,任何程序员都可以使用它)。


1
有趣,但是我从来不需要使用Singleton。如果需要在某个地方保存全局状态,可以将其放在配置文件中,并使用普通的类来访问它。
罗伯特·哈维

当然,在那种情况下,不需要……如果您真的需要一个对象来同步,线程安全地完成某项工作,那该怎么办?Singleton不仅用于保存某些静态变量的状态,它还是一个有实际工作要做的真实对象,等等
Cristian

我见过的唯一需求就是数据库连接。也就是说,该项目中几乎每个工作中的“ Service”(类似于工厂)类都是一个单例,存储在PHP $_SESSION变量中。
Tarka 2010年


1

我很惊讶没有人说过“ Builder”。或“适配器”。它们可能不像其他提到的那样具有异国情调,但我一直都在使用它们。工厂和抽象工厂也很常见(但是已经被使用了)。




0

在软件设计级别,我认为复合,策略和模板(在较小程度上扩展为工厂)是最广泛的用法。在过去的十年左右的时间里,当我们使用OO设计构建系统时,我们已经看到组合优先于继承。结果,上述模式的组合比所有其他IMO发挥了重要作用。

在架构上,我主张在企业上使用MVC,并在事物的嵌入式方面使用基于状态机的模式。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.