一、设计模式
1.1 定义
软件设计模式(Software Design Pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。也就是说,它是解决特定问题的一系列套路,是前辈们的代码设计经验的总结,具有一定的普遍性,可以反复使用。其目的是为了提高代码的可重用性、代码的可读性和代码的可靠性。
在软件工程中,设计模式(design pattern)是对软件设计中普通存在(反复出现)的各种问题,所提出的解决方案。由 埃里希·伽玛(Erich Gamma)等人在1990年代从建筑设计领域引入到计算机科学的。
设计模式并不直接用来完成代码的编写,而是描述在各种不同情况下,要怎么解决问题的一种方案。面向对象设计模式通常以类别)或对象)来描述其中的关系和相互作用,但不涉及用来完成应用程序的特定类别或对象。设计模式能使不稳定依赖于相对稳定、具体依赖于相对抽象,避免会引起麻烦的紧耦合,以增强软件设计面对并适应变化的能力。 ——维基百科
每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动。 —— Christopher Alexander
1.2 背景
“设计模式”这个术语最早被用于建筑设计领域中,后来才被引入到计算机领域。
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 构造器
function User(name , age, career) {
this.name = name
this.age = age
this.career = career
}
const user = new User(name, age, career)
使用构造器函数可以帮助我们减少输入重复属性的对象,把每个员工user都具备的属性(不变的部分)封装到构造器函数中,通过传入员工的个性信息作为参数(变的部分)来初始化一个含有员工特有信息的对象。