一、设计模式

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都具备的属性(不变的部分)封装到构造器函数中,通过传入员工的个性信息作为参数(变的部分)来初始化一个含有员工特有信息的对象。