持续创作,加速成长!这是我参与「掘金日新计划 · 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的设计模式很多,我们从创建类的角度上总结了最常用的单例模式和工厂模式。我们要了解这些主要的设计模式,在开发中应用起来,提高代码迭代和维护的成本。