设计模式是什么

俗话说:站在别人的肩膀上,我们会看得更远。设计模式的出现可以让我们站在前人的肩膀上,通过一些成熟的设计方案来指导新项目的开发和设计,以便于我们开发出具有更好的灵活性和可扩展性,也更易于复用的软件系统。

设计模式的一般定义如下:设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解并且保证代码可靠性。

狭义的设计模式是指GoF在《设计模式:可复用面向对象软件的基础》一书中所介绍的23种经典设计模式,不过设计模式并不仅仅只有这23种,随着软件开发技术的发展,越来越多的新模式不断诞生并得以应用。

虽然GoF设计模式只有23个,但是它们各具特色,每个模式都为某一个可重复的设计问题提供了一套解决方案。根据它们的用途,设计模式可分为创建型(Creational),结构型(Structural)和行为型(Behavioral)三种,其中创建型模式主要用于描述如何创建对象,结构型模式主要用于描述如何实现类或对象的组合,行为型模式主要用于描述类或对象怎样交互以及怎样分配职责,在GoF 23种设计模式中包含5种创建型设计模式、7种结构型设计模式和11种行为型设计模式。此外,根据某个模式主要是用于处理类之间的关系还是对象之间的关系,设计模式还可以分为类模式和对象模式。我们经常将两种分类方式结合使用,如单例模式是对象创建型模式,模板方法模式是类行为型模式。

值得一提的是,有一个设计模式虽然不属于GoF 23种设计模式,但一般在介绍设计模式时都会对它进行说明,它就是简单工厂模式,也许是太“简单”了,GoF并没有把它写到那本经典著作中,不过现在大部分的设计模式书籍都会对它进行专门的介绍。

下表列出将要介绍的24种设计模式,其中学习难度是前人在设计模式使用和推广过程中的经验总结,仅作参考,使用频率来自著名的模式推广和教育网站——http://www.dofactory.net

设计模式 学习难度 使用频率
单例模式 ★☆☆☆☆ ★★★★☆
简单工厂模式 ★★☆☆☆ ★★★☆☆
工厂方法模式 ★★☆☆☆ ★★★★★
抽象工厂模式 ★★★★☆ ★★★★★
原型模式 ★★★☆☆ ★★★☆☆
建造者模式 ★★★★☆ ★★☆☆☆
适配器模式 ★★☆☆☆ ★★★★☆
桥接模式 ★★★☆☆ ★★★☆☆
组合模式 ★★★☆☆ ★★★★☆
装饰模式 ★★★☆☆ ★★★☆☆
外观模式 ★☆☆☆☆ ★★★★★
享元模式 ★★★★☆ ★☆☆☆☆
代理模式 ★★★☆☆ ★★★★☆
职责链模式 ★★★☆☆ ★★☆☆☆
命令模式 ★★★☆☆ ★★★★☆
解释器模式 ★★★★★ ★☆☆☆☆
迭代器模式 ★★★☆☆ ★★★★★
中介者模式 ★★★☆☆ ★★☆☆☆
备忘录模式 ★★☆☆☆ ★★☆☆☆
观察者模式 ★★★☆☆ ★★★★★
状态模式 ★★★☆☆ ★★★☆☆
策略模式 ★☆☆☆☆ ★★★★☆
模板方法模式 ★★☆☆☆ ★★★☆☆
访问者模式 ★★★★☆ ★☆☆☆☆

设计模式有什么用

下面我们来回答最后一个问题:设计模式到底有什么用?简单来说,设计模式至少有如下几个用途:

  1. 设计模式来源众多专家的经验和智慧,它们是从许多优秀的软件系统中总结出的成功的、能够实现可维护性复用的设计方案,使用这些方案将可以让我们避免做一些重复性的工作,也许我们冥思苦想得到的一个“自以为很了不起”的设计方案其实就是某一个设计模式。在时间就是金钱的今天,设计模式无疑会为有助于我们提高开发和设计效率。
  2. 设计模式提供了一套通用的设计词汇和一种通用的形式来方便开发人员之间沟通和交流,使得设计方案更加通俗易懂。交流通常很耗时,任何有助于提高交流效率的东西都可以为我们节省不少时间。无论你使用哪种编程语言,做什么类型的项目,甚至你处于一个国际化的开发团队,当面对同一个设计模式时,你和别人的理解并无二异,因为设计模式是跨语言、跨平台、跨应用、跨国界的。
  3. 大部分设计模式都兼顾了系统的可重用性和可扩展性,这使得我们可以更好地重用一些已有的设计方案、功能模块甚至一个完整的软件系统,避免我们经常做一些重复的设计、编写一些重复的代码。此外,随着软件规模的日益增大,软件寿命的日益变长,系统的可维护性和可扩展性也越来越重要,许多设计模式将有助于提高系统的灵活性和可扩展性,让我们在不修改或者少修改现有系统的基础上增加、删除或者替换功能模块。
  4. 合理使用设计模式并对设计模式的使用情况进行文档化,将有助于别人更快地理解系统。如果某一天因为升职或跳槽等原因,别人接手了你的项目,只要他也懂设计模式,我想他应该能够很快理解你的设计思路和实现方案。
  5. 学习设计模式将有助于初学者更加深入地理解面向对象思想,让你知道:如何将代码分散在几个不同的类中?为什么要有“接口”?何谓针对抽象编程?何时不应该使用继承?如果不修改源代码增加新功能?同时还让你能够更好地阅读和理解现有类库与其他系统中的源代码,让你早点脱离面向对象编程的“菜鸟期”。

与昊
225 声望636 粉丝

IT民工,主要从事web方向,喜欢研究技术和投资之道