Chapter 38 设计模式

欢迎大家订阅【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() 方法中添加相应的逻辑,而不需要对其他代码进行修改,易于扩展,可维护性高。

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值