我认为这里涉及三个因素。
缺乏临界质量
首先,模式基本上只不过是为实现特定“功能”的某些代码命名。名称提供真正价值的唯一方法是,如果您可以依靠每个人都知道名称的含义,那么仅通过使用名称,他们就可以立即对代码有很多了解。
模式从来没有建立完成这些任务所需的临界质量。相反,AAMOF。自GoF书问世以来的20年左右的时间里,我敢肯定我没有看到多达十二次对话,每个参与其中的人都真正了解足够的设计模式以用于改善沟通。
简单地说:设计模式失败是因为它们失败了。
模式太多
我认为第二个主要因素是,如果有的话,它们最初会命名过多的模式。在相当多的情况下,模式之间的差异非常细微,几乎无法确切地确定某个特定类别是否适合一种模式或另一种模式(或可能两者-或两者都不适用)。
目的是您可以在更高层次上讨论代码。您可以将相当大的代码块标记为特定模式的实现。只需使用该预定义的名称,每个倾听的人通常都会对他们所关心的代码有足够的了解,因此您可以继续进行下一步。
现实往往恰恰相反。假设您正在开会,告诉他们这个特定的班级是一个Facade。会议中有一半人不知道或早已忘记确切的含义。其中之一要求您提醒他,门面与代理之间的确切区别。哦,这几位真正了解模式的人在会议的其余部分中讨论了是否应将其真正视为门面还是“仅仅是”适配器(那个家伙仍然坚持认为对他来说似乎是代理人)。
鉴于您的意图实际上只是在说:“此代码不是很有趣;让我们继续前进”,尝试使用模式名称只会增加注意力,而不是价值。
缺乏兴趣
大多数设计模式并没有真正处理代码中有趣的部分。他们处理类似的事情:“如何创建这些对象?”和“如何使该对象与那个对象对话?” 记住这些的模式名称(以及前面提到的有关细节之类的论点)仅仅是为大多数程序员不太在意的事情投入了很多精力。
换句话说,模式处理许多程序之间的相同问题,但是真正使程序变得有趣的是它与其他程序的不同之处。
摘要
设计模式失败是因为:
- 他们未能达到临界质量。
- 模式之间的差异不足以保证清晰度。
- 他们主要处理几乎没人真正关心的部分代码。