Python有哪些常用的设计模式

183 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情

前言

说到设计模式,这是在面试中经常被问到的问题。设计模式说起来较为抽象,它是对开发的各种问题而总结的设计方案。这些方案应对不同场景,考虑到了代码的封装性、复用性、移植性等因素。而在Python中总结出来的设计模式也非常多,今天就来说说Python常见的一些设计模式。

为什么要有设计模式

前言中我们有提到,设计模式是根据各种场景问题规范的设计方案。根据这些方案去写代码,可以提高我们的工作效率。

如果代码编写杂乱无章,那么代码经过迭代之后,维护成本就很高了。假设这时候代码有交接,那么接手的人就会很痛苦了,弄懂你的代码就得脱层皮。因此,了解常见的设计模式,依据那些设计模式来开发,对于代码可读性、迭代性和管理都有很大的帮助。

Python常用的设计模式

Python的设计模式非常之多,从不同角度来看又有不同的设计模式。我们从创建类的角度来看吧。

创建类设计模式主要有5个:

  • 单例模式:一个类定义后一个实例
  • 工厂模式(工厂方法、抽象工厂):工厂类实现实例创建,隐藏父类
  • 建造者模式:一个主类,将所有细节都交由子类实现
  • 原型模式:又称复制模式,本质是克隆对象。 下面我们主要来说说最常用的前2种设计模式。

单例模式

单例模式,简单来说就是在使用时,一个类定义后只有一个实例对象存在,不会有多次的实例创建。

我们知道实例的创建及销毁会使用内存资源,单例模式可以避免这些资源的频繁创建及销毁。工作中我们用到单例模式的场景也很多。比如说项目的配置信息,我们一般用一个类将配置解析出来,然后创建一个对象,需要用到配置的地方就引入这个对象。

单例模式的实现

单例模式的实现也很简单。需要了解的是,Python的模块就是天然的单例模式。不知道你有没有注意到,当你运行一次代码后,会在同目录下生成.pyc文件。这其实就是单例模式的使用。生成pyc文件后,后续每次运行都会直接运行pyc文件,而不用去加载py文件了。

我们来定义一个类来实现单例模式:

class SingleClass():
    def func_temp(self):
        return 1
single_obj = SingleClass()

首先在singular.py创建一个单例的类并实例化。当我们要用到这个类的方法属性时,直接导入创建好的对象,如下:

from singular import single_obj

print(single_obj.func_temp())

单例模式实现就这么简单。使用的场景也是非常之多。除了上面说到的配置读取,常见的还有log日志写入、经常要访问的文件对象等。

工厂模式

工厂模式就是创建一个工厂类对象,对实际类的实现细节不公开,要使用时,用户使用工厂类来创建新的对象。主要目的就是创建的对象不要向客户端暴露逻辑,子类自己决定该实例化哪个工厂类。

工厂模式的实现

实现也很简单,通过一个类作为对外接口。用户根据不同参数去选择实例化相应的类。

class Bike():
    """自行车类"""
    def run(self):
        return "1111"

class Moto():
    def run(self):
        return "2222"

# 构建一个工厂类,将实例化的过程封装,隐藏真正的类方法
class Factory():
    """工厂类"""
	@staticmethod
    def runs(name):
        if name == "bike":
            return Bike()
        elif name == "moto":
        	return Moto()
# 根据传参实例化不同的类
bike_obj = Factory.runs("bike")
moto_obj = Factory.runs("moto")

小结

Python的设计模式很多,我们从创建类的角度上总结了最常用的单例模式和工厂模式。我们要了解这些主要的设计模式,在开发中应用起来,提高代码迭代和维护的成本。