Python设计模式


概述

现代软件开发需要满足复杂的业务需求。还需要考虑到未来的可扩展性、可维护性等因素。良好的软件系统设计对于实现这些目标至关重要。设计模式在此类系统中发挥着重要作用。

为了理解设计模式,让我们考虑下面的例子 -

  • 每辆车的设计都遵循一个基本的设计模式,四个轮子、方向盘、油门-刹车-离合器等核心驱动系统等。

因此,所有重复建造/生产的东西,都不可避免地遵循其设计模式……汽车、自行车、披萨、自动取款机等等……甚至是你的沙发床。

设计几乎已成为软件中编码某些逻辑/机制/技术的标准方式,因此被称为或研究为软件设计模式。

为什么设计模式很重要?

使用设计模式的好处是 -

  • 通过经过验证的方法帮助您解决常见的设计问题。

  • 理解上没有歧义,因为它们有详细记录。

  • 减少总体开发时间。

  • 帮助您比其他方式更轻松地处理未来的扩展和修改。

  • 可以减少系统中的错误,因为它们是常见问题的经过验证的解决方案。

设计模式的分类

GoF(四人帮)设计模式分为三类,即创建型、结构型和Behave型。

创作模式

创建设计模式将对象创建逻辑与系统的其余部分分开。创造型模式不是您创建对象,而是为您创建对象。创建模式包括抽象工厂、构建器、工厂方法、原型和单例。

由于 Python 语言的动态特性,创建模式在 Python 中并不常用。此外,语言本身为我们提供了以足够优雅的方式创建所需的所有灵活性,我们很少需要在顶部实现任何内容,例如单例或工厂。

此外,这些模式提供了一种在隐藏创建逻辑的同时创建对象的方法,而不是直接使用 new 运算符实例化对象。

结构模式

有时,您需要使用现有的一组类来构建更大的结构,而不是从头开始。这就是结构类模式使用继承来构建新结构的地方。结构对象模式使用组合/聚合来获得新功能。适配器、桥接器、复合器、装饰器、外观、享元和代理都是结构模式。它们提供了组织类层次结构的最佳方法。

Behave模式

Behave模式提供了处理对象之间通信的最佳方法。此类别下的模式有:访问者、责任链、命令、解释器、迭代器、中介者、备忘录、观察者、状态、策略和模板方法是Behave模式。

因为它们代表系统的Behave,所以它们通常用于描述软件系统的功能。

常用的设计模式

辛格尔顿

它是所有设计模式中最具争议和最著名的模式之一。它用于过度面向对象的语言,并且是传统面向对象编程的重要组成部分。

单例模式用于,

  • 当需要实现日志记录时。记录器实例由系统的所有组件共享。

  • 配置文件使用它是因为信息缓存需要由系统中的所有不同组件维护和共享。

  • 管理与数据库的连接。

这是 UML 图,

统一建模语言图

class Logger(object):
   def __new__(cls, *args, **kwargs):
      if not hasattr(cls, '_logger'):
      cls._logger = super(Logger, cls).__new__(cls, *args, **kwargs)
return cls._logger

在此示例中,Logger 是单例。

当调用 __new__ 时,它通常会构造该类的一个新实例。当我们重写它时,我们首先检查我们的单例实例是否已创建。如果没有,我们使用 super 调用来创建它。因此,每当我们调用 Logger 上的构造函数时,我们总是会得到完全相同的实例。

>>>
>>> obj1 = Logger()
>>> obj2 = Logger()
>>> obj1 == obj2
True
>>>
>>> obj1
<__main__.Logger object at 0x03224090>
>>> obj2
<__main__.Logger object at 0x03224090>