常用的设计模式
当我们开始开发应用程序时,我们会遇到各种类型的问题。我们通过自己或咨询他人来解决这些问题。但是,当我们的应用程序的规模和复杂性增加时,可能会变得很难解决出现的问题。此外,这些问题变得如此普遍,以至于开发人员想出了一个关于如何解决这些问题的一般解决方案。
从形式上看,设计模式为软件设计中出现的常见问题提供了一个可重复使用的通用解决方案。尽管设计模式的概念已经存在了很长时间,但直到著名的四人帮(Gang of Four)走到一起,它才被正式化。这个四人帮由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides 组成,他们写下了这本书 设计模式:可重用的面向对象软件的要素.
大约有26种设计模式,可以分为3种主要类型:
- 创造性的--这些类型的设计模式涉及到对象的创建,使其适合我们正在工作的情况。
- 结构性--这些类型的设计模式更多的是涉及到对象的组成,这样对象之间的关系就会保持简单。
- 行为性的--这些类型的模式着重于管理系统中不同对象之间的通信。
本文将讨论每种设计模式的几个重要例子。
创造性的
单子
单子设计模式的重点是将一个类的实例化限制为只有一个对象。这种模式只是在一个类不存在的情况下才将其实例化。如果该类之前已经被实例化了,那么就会返回之前被实例化的对象。
当你想通过为函数提供一个单一的交互点来确保一个对象在你的应用程序中被共享时,这非常有用。
单子模式的一些应用包括日志、缓存、数据库连接等。
尽管Singleton有其有效的用例,但如果你发现需要在你的应用程序中反复使用Singelton,这表明我们可能需要重新评估我们的设计。此外,由于Singleton是紧耦合的,它在测试中会产生问题。
工厂
这种设计模式也属于创造型的设计模式。这种模式也关注于对象的创建。但工厂模式不是使用一个构造函数来创建几种类型的对象,而是使用一个通用接口来创建对象,我们可以指定我们希望创建的工厂对象的类型。
这就产生了一个更简单的接口,我们只需要输入我们想要创建的对象类型及其属性。工厂方法将用给定的属性创建适当的对象,并将其返回。当对象的创建过程很复杂且需要解耦时,这一点特别有用。
工厂模式的一个典型使用例子是UI工厂,我们根据UI工厂的输入来创建UI组件。
结构
门面
Facade模式的重点是为性质复杂的代码体提供一个高级接口。它可以被认为是你的代码体的API,隐藏底层的复杂性,只提供一个简化的接口。正因为如此,Facade模式属于结构模式的范畴。
这种模式也可以与其他模式耦合。例如,Facade对象通常是Singletons,因为只需要一个Facade对象。
装饰器
装饰器是一种结构化的设计模式,主要目的是实现代码的可重用性。装饰器只是一种用另一个函数包装一个函数的方式,以扩展其现有的能力。你通过用另一段代码包装来 "装饰 "你现有的代码。对于那些熟悉函数组合或高阶函数的人来说,这个概念并不陌生。
装饰器可以让你写出更干净的代码并实现组合。它还可以帮助你将相同的功能扩展到几个函数和类。从而使你能写出更容易调试和维护的代码。
装饰器还可以让你的代码不那么分散注意力,因为它将所有的功能增强代码从核心功能中移除。它还使你能够在不使你的代码变得复杂的情况下增加功能。
装饰器模式帮助我们用新的行为来包装函数,而不必担心修改原始函数的问题。它们还使我们能够不再依赖许多子类来获得同样的好处。
另一方面,过度使用装饰器可能会在我们的命名空间中产生许多小的类似对象。对于不熟悉该模式的开发者来说,在开始时可能也很难处理这个问题。
行为学
观察者
观察者是一种设计模式,其中一个对象(被称为主体)维护一个对主体感兴趣的对象(被称为观察者)的列表。当主体的状态发生变化时,主体就会通知观察者。当主体因为这个状态变化而需要通知观察者时,它可以发出一个通知,其中可能还包括相关的数据。如果需要,观察者也可以阻止自己被通知。
Angular开发者会对观察者和主体很熟悉。事实上,流行的RXJS库也大量使用主体。
除了这里涉及的5种设计模式外,还有大量的其他设计模式需要你去了解。此外,设计模式教给你解决你的问题类型的方法,而不是让你在你的应用程序中使用复制粘贴的解决方案。如何应用设计模式来解决手头的问题,这取决于开发人员。
你还必须注意,错误的设计模式应用于错误的问题,可能会导致糟糕的性能结果。