知行编程网知行编程网  2022-08-07 01:00 知行编程网 隐藏边栏 |   抢沙发  2 
文章评分 0 次,平均分 0.0

聊聊 Python 面试最常被问到的几种设计模式(上)

1. 前言

在很多人的印象里,Python 作为一款动态编程语言,在日常开发中也很少涉及到设计模式

事实上,任何一个编程语言都可以使用设计模式,它可以保证代码的规范性,只是每一种语言的实现方式略有不同而已

今天我们聊聊 Python 面试中,常被问到的 5 种设计模式,它们是:单例模式、工厂模式、构建者模式、代理模式、观察者模式

2. 单例模式

单例模式,是最简单常用的设计模式,主要目的是保证某一个实例对象只会存在一个,减少资源的消耗

Python 单例模式有很多实现方式,这里推荐下面 2 种

第 1 种,重写 __new__ 方法

定义一个实例变量,在 __new__ 方法中保证这个变量仅仅初始化一次

 cls._instance

使用方式如下:

(id(instance3))

第 2 种,闭包定义装饰器

使用闭包的方式定义一个单例装饰器,将类的定义隐藏到闭包函数中

 _singleton

使用上面装饰器的类,构建的实例都能保证单例存在


        self.arg1 = arg1

使用方式如下:

(id(instance2))

需要注意的是,上面 2 种方式创建的单例并不适用于多线程

要保证多线程中构建的实例对象为单例,需要在 __new__ 函数中使用 threading.Lock() 加入同步锁

 Singleton._instance

使用的时候,在线程任务中实例化对象,运行线程即可

):
        t = threading.Thread(target=task, args=[i, ])
        t.start()

这样,就保证了多线程创建的实例是单例存在的,不会导致脏数据!

3. 工厂模式

生产3种水果对象为例,定义 3 类水果,分别是:苹果、香蕉、橘
工厂模式包含:简单工厂、工厂方法、抽象工厂
第 1 种,简单工厂
简单工厂是最常见的工厂模式,适用于简单的业务场景
首先,定义一个工厂类,创建一个静态方法,根据输入的类型,返回不同的对象
使用方式如下:
第 2 种,工厂方法
工厂方法将创建对象的工作让相应的工厂子类去实现,保证在新增工厂类时,不用修改原有代码
首先,创建一个抽象公共工厂类,并定义一个生产对象的方法
接着,创建抽象工厂类的 3 个子类,并重写方法,创建一个实例对象并返回
 Orange()
最后的使用方式如下:
(instance_orange)
第 3 种,抽象工厂
如果一个工厂要生产多个产品,使用工厂方法的话,就需要编写很多工厂类,不太实用,使用抽象工厂就可以很好的解决这个问题
以川菜馆和湘菜馆炒两个菜,毛血旺和小炒肉为例
首先,创建川菜毛血旺、川菜小炒肉、湘菜毛血旺、湘菜小炒肉 4 个类
然后,定义一个抽象工厂类,内部定义两个方法,可以生成毛血旺和小炒肉

接着,创建抽象工厂类的两个子类,川菜工厂和湘菜工厂,重写方法,然后创建对应的实例对象返回
 XiaoCR_XC()
最后,使用川菜工厂和湘菜工厂分别炒两个菜
(maoxw_xc, xiaocr_xc)

4. 最后

单例模式和工厂模式是日常使用最为频繁的两种设计模式,下篇文章将聊聊后面 3 种设计模式

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享