Python面向对象 设计模式
现代软件开发需要解决复杂的业务需求。它还需要考虑未来的可扩展性和可维护性等因素。软件系统的良好设计对于实现这些目标至关重要。设计模式在这样的系统中扮演着重要的角色。
为了理解设计模式,让我们考虑下面的例子:
-
每辆车的设计都遵循一个基本的设计模式,四个轮子、方向盘、油门-刹车-离合器等核心驱动系统。
所以,所有重复建造/生产的东西,都不可避免地会在其设计中遵循某种模式……汽车、自行车、披萨、自动取款机,无论什么……甚至是你的沙发床。
几乎已成为在软件中编码某些逻辑/机制/技术的标准方式的设计,因此被称为或研究为软件设计模式。
为什么设计模式很重要?
使用设计模式的好处是:
-
通过行之有效的方法帮助你解决常见的设计问题。
-
理解上没有歧义,因为它们有据可查。
-
减少整体开发时间。
-
帮助你比其他方式更轻松地处理未来的扩展和修改。
-
可以减少系统中的错误,因为它们是常见问题的成熟解决方案。
设计模式分类
GoF(四人组)设计模式分为三类,即创造型、结构型和行为型。
创作模式
创建设计模式将对象创建逻辑与系统的其余部分分开。创建模式不是为你创建对象,而是为你创建它们。创建模式包括抽象工厂、构建器、工厂方法、原型和单例。
由于语言的动态特性,创建模式在 Python 中并不常用。语言本身也为我们提供了以足够优雅的方式创建所需的所有灵活性,我们很少需要在上面实现任何东西,比如单例或工厂。
这些模式还提供了一种在隐藏创建逻辑的同时创建对象的方法,而不是直接使用 new 运算符实例化对象。
结构模式
有时,你需要使用现有的一组类来构建更大的结构,而不是从头开始。这就是结构类模式使用继承来构建新结构的地方。结构对象模式使用组合/聚合来获得新功能。 Adapter、Bridge、Composite、Decorator、Façade、Flyweight 和 Proxy 是结构模式。它们提供了组织类层次结构的最佳方法。
行为模式
行为模式提供了处理对象之间通信的最佳方式。属于这一类的模式有:访问者、责任链、命令、解释器、迭代器、调解器、备忘录、观察者、状态、策略和模板方法是行为模式。
因为它们代表系统的行为,所以它们通常用于描述软件系统的功能。
常用的设计模式
辛格尔顿
它是所有设计模式中最具争议和最著名的一种。它用于过度面向对象的语言,是传统面向对象编程的重要组成部分。
单例模式用于,
-
当需要实现日志记录时。记录器实例由系统的所有组件共享。
-
配置文件使用它是因为信息缓存需要由系统中的所有各种组件维护和共享。
-
管理与数据库的连接。
这是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 是一个 Singleton。
当 __new__ 被调用时,它通常会构造该类的一个新实例。当我们覆盖它时,我们首先检查我们的单例实例是否已经创建。如果没有,我们使用 super 调用创建它。因此,每当我们调用 Logger 上的构造函数时,我们总是得到完全相同的实例。
>>> >>> obj1 = Logger() >>> obj2 = Logger() >>> obj1 == obj2 True >>> >>> obj1 <__main__.Logger object at 0x03224090> >>> obj2 <__main__.Logger object at 0x03224090>