python设计模式

本文深入探讨Python中的设计模式,主要讲解单例模式和工厂模式。单例模式确保类只有一个实例,常用于全局变量场景,文中通过类方法和__new__方法展示了两种实现方式。而工厂模式则是一种对象创建模式,通过工厂方法或简单工厂模式减少类间的依赖,提高代码的扩展性和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0 前言

设计模式初衷是在实现业务后,采用设计模式对代码进行优化,提高代码效率,提高代码的可维护性和可扩展性,本质就是减弱面向对象中的类之间的依赖关系。

1. 单例模式

1.1 定义

  • 确保某一个类中只有一个实例
  • 可以实例化,并向整个类提供这个实例,这个类就叫做单例
  • 单例模式是一种对象创建型模式

1.2.0 什么时候用单例

以后情况中的一种使用单例模式:

  • 该类创建一个对象时会消耗大量的内存
  • 该类的数据可以作为整个程序的全局变量

1.2 创建单例模式

1.2.1 最简单的构建方法–采用类方法

在这里插入图片描述

上述代码中的单例模式为伪单例模式。存在以下缺点:

  • 必须利用getinstance方法才能实现单例,如果利用类名传入,如u3,则上述代码不为单例模式
  • 在u1 u2时调用后,u1和u2的name都是zs,在u2创建时,类中已将存在zs的实例,直接返回zs的实例

1.2.2 最简单的构建方法-- 利用__new__方法

重写__new__方法,保证其只执行一次。
在这里插入图片描述
上述代码执行步骤:
创建u1和u2的步骤如下。u1 = User(’zs‘)时,会调用__new__方法在内存中创建一个对象,然后调用__intit方法对该对象的属性name进行赋值为’zs’,最后将u1指向这个对象。
调用u2 = User(’ls‘)时,调用__new__方法,由于已将存在实例,__new__方法会直接返回由u1指向的实例对象,然后调用__init__方法进行赋值’ls’操作,会将该实例对象的属性值name赋值为’ls’,最后将u2指向该实例对象。
综上,u1和u2都指向了同一个实例对象,实例对象的属性值为’ls’。
这种单例方法好处和缺点

  • 优点:
    解决了利用类方法getInstance的利用类名创建对象时的缺点
  • 缺点
    创建对象时采用object类的__new__时
    在这里插入图片描述
    创建出来的类不为单例,上述方法用的及其少。
    因此,python中不能完成单例。

1.3 工厂模式

1.3.1 引言

  • 是常见的实例化对象模式
  • 本质是用工厂方法代替new操作的一种模式
  • 缺点:会增加工作量
  • 优点:会增加代码的扩展性;减少代码的修改量(增强可维护性)
  • 采用第三方(工厂)减弱两个类之间的依赖关系实现对代码的优化

1.3.2 简单工厂模式

  • 工厂中存在静态方法,并在类中采用类方法调用
  • 工厂的作用根据一个类指定类型产生另一个类的对象。
  • 两种方法:1.采用静态方法,如下;2. 采用全局函数方式(将工厂类的方法作为全局方法,减弱了面向对象的概念,很少用)

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

1.3.2 工厂方法模式

  • 去掉了简单工厂模式的静态方法
  • 将工厂定义为抽象类,将产生的类的定义为各种子类,重写工厂类中的方法。
  • 直接在主类中调用工厂子类。
    如下:

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值