一个C++程序员应该知道的著名设计模式

32

可能是重复问题:
C++程序员应该使用哪些C++惯用法?

在阅读了《C++ Primer》、《Effective C++》和《TC++PL》等书籍后,我想学习一些重要的设计模式。

那么,每个C++程序员都应该知道哪些著名的设计模式呢?


6
为什么有人投票选择“不是一个真正的问题”?x-( - Prasoon Saurav
2
许多编程爱好者已经问过同样的问题。 - user240141
2
我的问题是关于C++的,不仅仅是与设计模式有关的...我认为他们没有读到“一个C++程序员应该知道”的部分。 - Prasoon Saurav
3
除了学习设计模式之外,我还希望强调学会何时使用它们以及何时不应该使用它们。我对人们提出的任何答案都很感兴趣,但尽可能给出设计模式有用性的限制。 - Ephphatha
6个回答

26

C++特定的两个技术:RAII和PIMPL。


很难说这些中哪个最重要。PIMPL并没有被充分利用,可能是因为担心间接调用开销和将对象强制放在堆上而不是栈上的影响。 - user180247
这里最好的答案,因为问题更多地涉及C++特定的模式。我只能将SFINAE添加到列表中。我知道它更像是一条规则而不是一个模式,但是这个规则本身的使用可以被称为一种模式。 - Mariusz Jaskółka

20

显而易见的答案是来自著名书籍的四人帮设计模式。这些是到处列出的相同模式。

http://en.wikipedia.org/wiki/Design_Patterns

除此之外,浏览一下Martin Fowler的网站...

http://martinfowler.com/

这里有一些内容 - "依赖注入"可能是最著名的。其他大多数都是领域特定的。

"Mixin层"对于C ++来说可能很有趣。模板类将其自己的基类作为模板参数,以便可以将模板用于向许多不同的类添加相同的功能,或者作为组合方法,以便可以轻松地包括/排除库的各种功能。奇怪的递归模板技巧有时也会被使用(原始基类是最终完全组成的类),以便各种mixin层可以进行某种程度的"反射",从而可以根据完全组成的成员类型等定义中间方法。当然,如果不小心,它可能会有点容易出现无法解决的循环依赖。

http://portal.acm.org/citation.cfm?id=505148


注意 - "原始基类"并不意味着继承的原始基类,因为那将导致非法继承循环 - 它只是一个模板参数,用于引用、访问最终结果中的类型/常量等,并且可能用于元编程反射技术。
说实话,我现在不知道当时写"base"时是否感到困惑,还是只是选择了一个令人困惑的词语。

9

7
这并没有回答我的问题。 - Prasoon Saurav
2
@Prasoon Saurav:是的,它可以。 - greyfade
我只是不想要一本“设计模式”书的名字。 - Prasoon Saurav
3
这本书不是一本设计模式书籍,而是被誉为“四人帮”的设计模式经典著作。请注意,“the”表示这是权威性的,无可争议的。 - greyfade
3
好的,我已经接受了Steve的回答,因为我认为只有他的回答是“完整的” :) - Prasoon Saurav
1
这本书是以C ++为基础编写的吗? - a06e

9

以下是我最常见和使用的四人帮模式,排名不分先后:

  • 组合模式
  • 模板方法模式
  • 抽象工厂模式
  • 单例模式(虽然备受诟病,但无处不在)
  • 访问者模式
  • 建造者模式
  • 代理模式

8

1
我猜那本是关于Java设计模式的书吧? - Kamran Bigdely
1
@kami:是的,代码示例是用Java编写的,但这些模式适用于所有面向对象的编程语言。 - Nate W.

8
思维模式,是解决问题的万能钥匙。

我认为“银弹”是那些不需要思考就能解决问题的魔法解决方案。在开发中并没有太多这样的东西。 - user180247

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