Python设计模式

2024-08-15 16:00:39 浏览数 (3)

在软件开发中,设计模式提供了一种可重用的解决方案,以应对在特定环境中反复出现的问题。这些模式是基于经验总结的最佳实践,能够提高代码的可维护性、可读性和灵活性。以下是两个常用的设计模式的详细介绍:单例模式和工厂模式。

一、单例模式

①定义

单例模式是一种创建型设计模式,确保某个类只有一个实例,并提供一个全局访问点。

②适用场景

  • 系统只需要一个共享的实例来管理某些资源时(如配置管理、日志记录)
  • 多个客户端需要访问该实例时

在Python中,创建类的实例后,可以得到一个完整、独立的对象。以下是一个简单的示例:

代码语言:python代码运行次数:0复制
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文件中定义一个实例

代码语言:python代码运行次数:0复制
class StrTools:
    pass

str_tool=StrTools()

b. 导入实例:

在另一个文件中导入这个实例

代码语言:python代码运行次数:0复制
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 实例,它们实际上引用的是同一个对象,所以都指向同一个内存地址。

二、工厂模式

①定义

工厂模式是一种创建型设计模式,通过定义一个接口来创建对象的实例,而不需要指明具体类的实例化过程。

②适用场景

  • 需要大量创建相似类型的对象时
  • 系统需要对产品的创建过程进行管理时

使用类的构造去创建对象:

代码语言:python代码运行次数:0复制
class Person:
    pass

class Worker(Person):
    pass

class Student(Person):
    pass

class Teacher(Person):
    pass


worker=Worker()
stu=Student()
teacher=Teacher()

【分析】

该段代码简单直接,适合于简单对象创建、类数目较少、无复杂依赖关系的代码场景。但代码扩展性较差,当需要新增大量子类时,需要在每个地方修改代码,会增加维护成本。

基于工厂提供的方法去创建对象:

代码语言:python代码运行次数:0复制
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() 方法中添加相应的逻辑,而不需要对其他代码进行修改,易于扩展,可维护性高。

0 人点赞