Python常见设计模式浅析

这是我参与更文挑战的第 29 天,活动详情查看: 更文挑战

1. 概述

我们常听大佬说,你这套代码用的什么设计模式?

咦,什么是设计模式,听不懂大佬在说啥(笑哭.jpg),赶紧学习一下

设计模式是软件设计常见问题的典型解决方案。它们就像能根据需求进行调整的预制蓝图,可用于解决代码中反复出现的设计问题

设计模式与方法或库的使用方式不同,我们很难直接在自己的程序中套用某个设计模式。 模式并不是一段特定的代码, 而是解决特定问题的一般性思想。 你可以根据模式来实现符合自己程序实际所需的解决方案

设计模式是针对面向对象语言持有的内容,是我们在面临一类的问题时候固定的做法,设计模式很多种,比较流行的是:(四人组)GOF23 种设计模式。

GOF23

面向对象(OOP)是一种范式,其思想理念在代码上就是将数据块及数据相关的行为封装成特殊的,名为对象的实体,同时对象实体的生成工作是基于程序员给出的一系列“蓝图”,这些蓝图就是类。关于,面向对象特性三大特性(封装、继承、多态)。

为什么要使用设计模式?

优秀的设计模式,可以提高我们代码质量,主要有三点:

  1. 代码复用,提高开发效率,减少开发成本最常用的方式之一
  2. 扩展性强,能够在原基础的代码上开发新功能或者需求,快速上线
  3. 维护便利,好的框架转维护后,可以减少人员的投入

因此,对于初学者,我们学习两个最常用的模式:工厂模式和单例模式

本期,我们也从最常用的两个模式学习和模拟。

2. 工厂模式

工厂模式是一种创建型设计模式,实现了创建者和调用者的分离,使用专门的工厂类型将选择实现类、创建对象进行统一的管理和控制。

工厂模式采用在父类中提供一个创建对象的方法,允许子类决定实例化对象的模型。

工厂模式结构如下:

工厂模式结构

工厂模式适用场景有:

  • 用户能扩展软件库或框架的内部组件

  • 无法预知对象确切类别及其依赖关系

  • 复用现有对象来节省系统资源,从而不用每次都重新创建对象

我们来实现一个简单的工厂模式DEMO,生产汽车。

class CarFactory:

    def createcar(self,brand): # 对外统一由这个方法来创建不同类的对象
        if brand == "奔驰":
            return BENCI()
        elif brand == "宝马":
            return  Baoma()
        else:
            return BYD()


class Baoma:
    pass

class BENCI:
    pass

class BYD:
    pass

factory = CarFactory()

car1 = factory.createcar("BYD")
car2 = factory.createcar("宝马")
print("Car1车型为:",car1)
print("Car2车型为:",car2)
复制代码

工厂模式DEMO运行结果

工厂模式的优点:

  1. 可以避免创建者和具体产品之间的紧密耦合。
  2. 单一职责原则。 可以将产品创建代码放在程序的单一位置, 从而使得代码更容易维护。
  3. 开闭原则。 无需更改现有客户端代码,可以在程序中引入新的产品类型。

工厂模式的缺点:

应用工厂方法模式需要引入许多新的子类, 代码可能会因此变得更复杂。 最好的情况是将该模式引入创建者类的现有层次结构中。

3. 单例模式

单例模式(Singleton Pattern)的核心作用是确保一个类只有一个实例,并且提供一个访问该实例的全局访问点。

单例模式结构

单例模式结构

  1. 创建对象时,会判断是否存在,如果存在则返回对象;如果不存在,创建新对象

单例模式适用场景有:

  • 程序对所有客户端只创建一个可用实例
  • 需要更加严格地控制全局变量

我们按照单例模式,来实现一个小DEMO

class MySinglection:

    __obj = None    #类属性,标志创建对象是否存在,如果存在则返回
    __init_flag = True

    def __new__(cls, *args, **kwargs):
        if cls.__obj == None:
            cls.__obj = object.__new__(cls)

        return cls.__obj

    def __init__(self,name):
        if MySinglection.__init_flag:
            print ("Init.....")
            self.name = name
            MySinglection.__init_flag = False #类进行调用类属性

my = MySinglection("aaa")
my2 = MySinglection("BB")
print ("my对象信息为:",my)
print ("my2对象信息为:",my2)
复制代码

单例模式DEMO运行结果

单例模式优点

  • 单例模式只生成一个实例对象,减少了对系统资源的开销。当一个对象的产生需要比较多的资源,如读取配置文件、产生其他依赖对象时,可以产生一个单例对象,然后永久驻留内存中,从而极大的降低开销。
  • 获得了一个指向该实例的全局访问节点。
  • 仅在首次请求单例对象时对其进行初始化

单例模式缺点

  • 违反了_单一职责原则_
  • 单例模式可能掩盖不良设计, 比如程序各组件之间相互了解过多等。
  • 该模式在多线程环境下需要进行特殊处理, 避免多个线程多次创建单例对象。
  • 单例的客户端代码单元测试可能会比较困难, 因为许多测试框架以基于继承的方式创建模拟对象。

总结

本期我们学习和了解设计模式的基本概念,用Python去实现了我们常用到的工厂模式和单例模式,在工作中,根据实现场景的需要,我们要提前设计我们代码起到重要的作用。

为此,我们在学有余力的情况下,掌握好设计模式,也为我们的能力提升带来显著的效果。

好啦,以上是本期内容,欢迎大家评论区留言讨论,点赞关注,下次见~

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享