理解Design Pattern
本文的目的是以最精炼的语言,理解什么是Design Pattern,为什么需要Design Pattern,和关于Design Pattern的争论。
什么是Design Pattern?
从字面上理解,Pattern,指的是解决常见问题的可重用的方案。Design,则限定了,这里的Pattern是为软件的设计服务的。因此,所谓Design Pattern,指的是解决常见的软件设计问题的可重用的方案,或者说解决方案的模板。
两点需要特别注意的是:
- 算法不是Design Pattern。
- Design Pattern是为Design服务的,而不是为具体的实现服务的。
说道什么是Design Pattern,不得不提起一本书:《Design Patterns: Elements of Reusable Object-Oriented Software》,俗称Gang of Four或者是GoF。为什么?因为这本书太有名了,有名到太多人从听说到自以为熟悉Design Pattern,都是通过它,甚至狭义地认为所谓Design Pattern,就是指的GoF中的23种Pattern。这真是一个相当大的误会了。同样的,很多人提到Design Pattern,必提到SOLID原则,其实也是误会,SOLID是面向对象设计的基本原则,并非Design Pattern的基本原则,只是因为GoF是面向对象的Design Pattern,所以GoF中的Pattern自然需要遵守面向对象的SOLID原则。
针对不同的软件开发领域,其实有许多前人总结的Pattern。例如:GoF其实属于典型的面向对象Design Pattern,是前人从面向对象的设计实践中,总结的一些典型的Pattern。另外,还有针对架构设计的Pattern,针对企业集成的Pattern,针对SOA的Pattern,等等。大大牛Martin Fowler维护了一个他个人感兴趣的不同开发领域的Deisng Pattern的Catalogs。
Pattern只是针对不同的场景的一些可重用的方案,因此,无需崇拜甚至神话任何已有的Pattern。一但一个Pattern服务的问题场景发生了变化,则往往可能导致这个Pattern不再适用此场景,或者需要被修正。任何人也都可以发现和总结新的Pattern。
为什么需要Design Pattern?
应用Design Pattern主要的好处如下:
- 降低设计成本 - 每一个Design Pattern是解决一个常见问题设计问题最佳实践,因此,对于相同的问题,我们就无需做重复的设计,只需要重用即可。
- 降低设计风险 - 相对于未经实现证明的朴素的设计,Design Pattern作为来源于实践,并且已经被前人证明的最佳实践,无疑风险更小。
- 降低讨论和交流的成本 - 对于软件设计专家之间对设计的交流,如果大家都理解同一个Design Pattern,则无需提供太多的设计细节,就能让对方理解一个设计,因此交流的成本大大降低。
关于Design Pattern的争论
Design Pattern是否影响性能?
一定程度上,可以说“是”。相对于直接、朴素的实现,Design Pattern为了获得一定的灵活性,往往会引入一些额外的层次,对于局部来说,客观上的确是占用更多的资源,或者影响一些性能。
但是,我们不能孤立的看问题。撇开那些有极至性能要求的应用,Design Pattern在局部引入的一点点性能损失,往往并非是不可接受的,且还要考虑到其带来的其他好处;而一个错误的或者不够灵活的设计更有可能造成程序整体的缺陷和瓶颈,并且往往补救的成本要高得多。
Design Pattern是否为了弥补具体语言描述能力的不足?
判断这个命题,要看这里的“Design Pattern”是泛指,还是特指。如果是特指,Design Pattern既然只是指一些可重用的方案模板,针对,一些本身就是来源于特定语言的编程实践来说,当然,未尝不能使这个命题成立。例如:Core J2EE Patterns。
但是,对于更多的并非来源于具体语言的的Design Pattern,如GoF这样的面向对象设计的Design Pattern,它关注的是面向对象设计的基本原则和限制,和具体的语言没有任何关系,又何来“弥补具体语言描述能力的不足”之说呢?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库