欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能!
前言
在软件开发中,设计模式提供了一种可重用的解决方案,以应对在特定环境中反复出现的问题。这些模式是基于经验总结的最佳实践,能够提高代码的可维护性、可读性和灵活性。本章详细介绍了两个常用的设计模式:单例模式和工厂模式。
本篇文章参考:黑马程序员
一、单例模式
①定义
单例模式是一种创建型设计模式,确保某个类只有一个实例,并提供一个全局访问点。
②适用场景
- 系统只需要一个共享的实例来管理某些资源时(如配置管理、日志记录)
- 多个客户端需要访问该实例时
在Python中,创建类的实例后,可以得到一个完整、独立的对象。以下是一个简单的示例:
class StrTools:
pass
s1=StrTools()
s2=StrTools()
print(s1)
print(s2)
输出结果:
<main.StrTools object at 0x000001AB2A816240>
<main.StrTools object at 0x000001AB2A814E30>
【分析】
通过 print
语句可以看出,s1和s2的内存地址不同,这表明它们是完全独立的两个对象。
然而,在某些场景下,我们可能希望一个类不论被实例化多少次,都只提供一个具体的实例。这种设计可以帮助我们节省创建对象的开销和内存使用。例如,对于一些工具类,只需一个实例即可在各个地方使用。这也正是单例模式(Singleton Pattern)所要实现的效果。通过单例模式,我们可以确保在整个应用程序中只有一个实例存在,从而优化资源管理并提升性能。
③实现方式
a. 定义实例:
在一个.py文件中定义一个实例
class StrTools:
pass
str_tool=StrTools()
b. 导入实例:
在另一个文件中导入这个实例
from str_tools import str_tool
s1=str_tool
s2=str_tool
print(s1)
print(s2)
输出结果:
<str_tools_py.StrTools object at 0x000001AB2A803F50>
<str_tools_py.StrTools object at 0x000001AB2A803F50>
【分析】
s1 和 s2 都指向同一个 str_tool 实例,它们实际上引用的是同一个对象,所以都指向同一个内存地址。
二、工厂模式
①定义
工厂模式是一种创建型设计模式,通过定义一个接口来创建对象的实例,而不需要指明具体类的实例化过程。
②适用场景
- 需要大量创建相似类型的对象时
- 系统需要对产品的创建过程进行管理时
使用类的构造去创建对象:
class Person:
pass
class Worker(Person):
pass
class Student(Person):
pass
class Teacher(Person):
pass
worker=Worker()
stu=Student()
teacher=Teacher()
【分析】
该段代码简单直接,适合于简单对象创建、类数目较少、无复杂依赖关系的代码场景。但代码扩展性较差,当需要新增大量子类时,需要在每个地方修改代码,会增加维护成本。
基于工厂提供的方法去创建对象:
class Person:
pass
class Worker(Person):
pass
class Student(Person):
pass
class Teacher(Person):
pass
class PersonFactory:
def get_person(self,p_type):
if p_type=="w":
return Worker()
elif p_type=="s":
return Student()
else:
return Teacher()
pf=PersonFactory()
worker=pf.get_person("w")
stu=pf.get_person("s")
worker=pf.get_person("t")
【分析】
这段代码将对象的创建封装在工厂类中,通过工厂类的 get_person()
方法来创建具体的类对象,符合现实世界的模式,即由工厂负责生产产品(对象)。如果未来要添加新的子类(如 Admin),只需在 get_person()
方法中添加相应的逻辑,而不需要对其他代码进行修改,易于扩展,可维护性高。