一、设计模式

1.1 定义

软件设计模式(Software Design Pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。也就是说,它是解决特定问题的一系列套路,是前辈们的代码设计经验的总结,具有一定的普遍性,可以反复使用。其目的是为了提高代码的可重用性、代码的可读性和代码的可靠性。

在软件工程中,设计模式(design pattern)是对软件设计中普通存在(反复出现)的各种问题,所提出的解决方案。由 埃里希·伽玛(Erich Gamma)等人在1990年代从建筑设计领域引入到计算机科学的。

设计模式并不直接用来完成代码的编写,而是描述在各种不同情况下,要怎么解决问题的一种方案。面向对象设计模式通常以类别)或对象)来描述其中的关系和相互作用,但不涉及用来完成应用程序的特定类别或对象。设计模式能使不稳定依赖于相对稳定、具体依赖于相对抽象,避免会引起麻烦的紧耦合,以增强软件设计面对并适应变化的能力。 ——维基百科

每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动。 —— Christopher Alexander

1.2 背景

“设计模式”这个术语最早被用于建筑设计领域中,后来才被引入到计算机领域。

建筑的永恒之道.pdf

1.3 模式的基本要素

一般而言,一个模式有四个基本要素:

  • 模式名称:一个助记名,它用一两个词来描述模式的问题、解决方案和效果
  • 问题:描述了应该在何时使用模式,它解释了设计问题和问题存在的前因后果,它可能描述了特定的设计问题,如怎样用对象表示算法等。也可能描述了导致不灵活设计的类或对象结构
  • 解决方案:描述了设计的组成成分,它们之间的相互关系及各自的职责和协作方式
  • 效果:描述了模式应用的效果及使用模式应权衡的问题

1.4 设计模式的描述

用统一的格式描述设计模式,每一个模式根据以下模版被分成若干部分。模版具有统一的信息描述结构,有助于你更容易学习、比较和使用设计模式。

名称 描述
模式名 每一个模式都有自己的名字,模式的名字使得我们可以讨论我们的设计。
问题 面向对象的系统设计过程中反复出现的特定场合,它导致我们采用某个模式
解决方案 上述问题的解决方案,其内容给出了设计的各个组成部分,它们之间的关系、职责划分和协作方式
别名 一个模式可以有超过一个以上的名称。这些名称应该要在这一节注明
动机 在哪种情况使用该模式,是本节提供的方案(包括问题与来龙去脉)的责任
适用性 模式适用于哪些情况、模式的背景等等
结构 这部分常用类图与交互图阐述此模式
参与者 这部分提供一份本模式用到的类与对象清单,与它们在设计下扮演的角色
合作 描述在此模式下,类与对象间的交互
影响 采用该模式对软件系统其他部分的影响,比如对系统的扩充性、可移植性的影响。影响也包括负面的影响。这部分应描述使用本模式后的结果、副作用、与权衡(trade-off)
实现 这部分应描述实现该模式、该模式的部分方案、实现该模式的可能技术、或者建议实现模式的方法
示例 简略描绘出如何以编程语言来使用模式
已知应用 业界已知的实现示例
相关模式 这部分包括其他相关模式,以及与其他类似模式的不同

1.5 设计模式的分类

分类准则 目的
创建型(creational) 结构型(structural) 行为型(behavioral)
与对象的创建有关 处理类或对象的组合 对类或对象怎样交互和怎样分配职责进行描述
范围 处理类和子类间的关系。这些欢喜在编译时刻确定下来,静态的 工厂方法(Factory Method) 常用 适配器(Adapter(类) )常用 解释器(Interpreter)不常用
模版方法(Template Method) 常用
对象 处理对象间的关系。这些关系在运行时刻是可以变化的,动态的 抽象工厂(Abstract Factory) 常用
生成器(Builder)
原型(Prototype)
单件/单例(Singleton)常用
适配器(Adapter(对象) )常用
桥接(Bridge)
组成(Composite)
装饰(Decorator )常用
外观(Facade)
享元(Flyweight)
代理(Proxy)常用
职责链(Chain of Responsibility)常用
命令(Command)不常用
迭代器(Iterator)常用
中介者(Mediator)不常用
备忘录(Memento)不常用
观察者(Observer )常用
状态(State)常用
策略(Strategy) 常用
访问者(Visitor)不常用

上表根据两条准则对模式进行分类。

第一个是目的准则,即模式是用来完成什么工作的。模式依据其目的可分为创建型、结构型和行为型。
第二个是范围准则,指定模式主要是用于类还是对象。

1.6 SOLID设计原则

设计原则是设计模式的指导理论,它可以帮助我们规避不良的软件设计。SOLID 指代的五个基本原则分别是:

  • 单一功能原则(Single Responsibility Principle)常用
  • 开放封闭原则(Opened Closed Principle)常用
  • 里式替换原则(Liskov Substitution Principle)
  • 接口隔离原则(Interface Segregation Principle)
  • 依赖反转原则(Dependency Inversion Principle)

所有的设计模式都是围绕着其中几个原则展开的

1.7 设计模式的核心思想——封装变化

在实际开发中,不发生变化的代码是不存在的,能做的只有将这个变化的影响最小化——将变与不变分离,确保变化的部分灵活、不变的部分稳定。

二、创建型模式

2.1 工厂模式

2.1.1 构造器

  1. function User(name , age, career) {
  2. this.name = name
  3. this.age = age
  4. this.career = career
  5. }
  6. const user = new User(name, age, career)

使用构造器函数可以帮助我们减少输入重复属性的对象,把每个员工user都具备的属性(不变的部分)封装到构造器函数中,通过传入员工的个性信息作为参数(变的部分)来初始化一个含有员工特有信息的对象。