7种最重要的软件设计模式

2021-02-13  本文已影响0人  魂斗驴

为什么要设计模式?

设计模式已成为最近在编程界引起争议的对象,这在很大程度上是由于设计模式被认为是“过度使用”而导致难以理解和管理的代码。

重要的是要理解,设计模式绝不应该被拼合在一起,而可以以一种“千篇一律”的方式将快捷方式应用到您的代码中。最终,软件工程中无法替代真正的问题解决能力。

但是,事实仍然是,如果在正确的情况下以及出于正确的原因使用设计模式,设计模式将非常有用。如果策略性地使用它们,可以避免重新发明众所周知的轮子,而不必使用已经被别人提炼的方法,从而可以使程序员效率大大提高。当与他人讨论或在较大的团队中管理代码时,它们还提供了有用的通用语言来概念化重复出现的问题和解决方案。

话虽如此,一个重要的警告是确保开发人员也理解每种模式背后的方式和原因。
事不宜迟(从大到小,从总体上看,重要性顺序高低):

1.单例

单例模式用于将类的创建限制为仅一个对象。当需要一个(只有一个)对象来协调整个系统中的动作时,这是有益的。有几个示例,其中仅应包含类的单个实例,包括缓存,线程池和注册表。

初始化一个类的对象很简单-但是我们如何确保只创建一个对象呢?答案是使构造函数“私有”到我们打算定义为单例的类。这样,只有该类的成员才能访问私有构造函数,而没有其他人可以访问。

重要考虑事项:可以通过使构造函数受保护而不是私有来继承单例。在某些情况下这可能是合适的。在这些情况下采用的一种方法是创建子类的单例寄存器,而getInstance方法可以采用参数或使用环境变量来返回所需的单例。然后,注册表维护字符串名称到单例对象的映射,可以根据需要对其进行访问

2.工厂方法

普通工厂生产商品;软件工厂生产对象。不仅如此,它还没有指定要创建的对象的确切类。为此,可通过调用工厂方法而不是调用构造函数来创建对象。


通常,用Java创建对象的过程如下:

SomeClass someClassObject = new SomeClass();

上述方法的问题在于,使用SomeClass对象的代码现在突然变得依赖SomeClass的具体实现。使用new创建对象并没有错,但是它伴随着将我们的代码紧密耦合到具体实现类的负担,这有时会出现问题。

3.策略

策略模式允许在抽象之下将相关算法分组,这允许在不修改客户端的情况下将一种算法或策略切换为另一种。该代码不是直接实现单个算法,而是接收运行时指令,这些指令指定要运行的算法组。

4.观察者

此模式是对象之间的一对多依赖关系,因此当一个对象更改状态时,将通知其所有依赖关系。这通常是通过调用其方法之一来完成的

为了简单起见,请考虑当您在Twitter上关注某人时会发生什么。您实质上是在要求Twitter将您关注的人(主题)的最新消息发送给您(观察者)。该模式包括两个参与者,一个是对更新感兴趣的观察者,另一个是生成更新的主题。

一个主题可以有许多观察者,并且是一对多的关系。但是,观察者也可以自由订阅其他主题的更新。您可以从Facebook页面订阅新闻提要,这将成为主题,并且只要页面上有新帖子,订阅者就会看到新帖子。
关键考虑因素:如果有许多主题且观察者很少,则每个主题分别存储其观察者,则会增加存储成本,因为某些主题会多次存储同一观察者

5.建造者

顾名思义,构建器模式用于构建对象。有时,我们创建的对象可能很复杂,由多个子对象组成,或者需要复杂的构造过程。通过使用构建器模式,可以简化创建复杂类型的过程。甲复合或聚集对象是什么助洗剂通常构建。

关键考虑因素:构建器模式似乎与“抽象工厂”模式相似,但不同之处在于,构建器模式逐步创建对象,而抽象工厂模式则一次性生成对象。

6.转接器

这样可以通过将一个类的接口转换为另一个类来使不兼容的类协同工作。可以将它视为一种翻译:当两个不会说一种共同语言的国家元首见面时,通常会有一名翻译坐在这两者之间,翻译对话,从而实现交流。

如果您有两个应用程序,其中一个将XML输出作为输出,而另一个则需要JSON输入,那么您将需要在两者之间使用适配器以使其无缝运行。

7.状态

状态模式封装了机器可以处于的各种状态,并允许对象在其内部状态更改时更改其行为。正如机器所说的那样,机器或上下文可以对机器执行某些操作,以使其进入不同的状态。如果不使用该模式,则代码将变得僵硬,并带有if-else条件语句。

参考

The 7 Most Important Software Design Patterns

上一篇下一篇

猜你喜欢

热点阅读