设计模式(Design Pattern)

发布于:2025-08-11 ⋅ 阅读:(11) ⋅ 点赞:(0)

概念

       设计模式(Design Pattern)是针对软件设计中重复出现的问题,总结出的一套经过验证的解决方案,

       它描述了在特定场景下如何组织代码结构、类与对象的关系,帮助开发者编写更高效、可维护、可扩展的代码。

分类

《设计模式:可复用面向对象软件的基础》根据用途,把设计模式分为三大类,共23种经典模式

(1)创建型模式(5 种)

解决 “对象创建” 的问题,隐藏创建细节,使代码更灵活。

       单例模式:保证一个类只有一个实例(如全局配置对象)。

       工厂模式:通过工厂类统一创建对象,屏蔽具体实现(如不同数据库连接的创建)。

       抽象工厂模式:创建一系列相关或依赖的对象(如一套 UI 组件的不同主题实现)。

       建造者模式:分步构建复杂对象(如自定义电脑配置:CPU、内存、硬盘分步组装)。

       原型模式:通过复制现有对象创建新对象(如大对象的快速克隆)。

(2)结构型模式(7 种)

解决 “类或对象的组合” 问题,优化代码结构。

       适配器模式:使不兼容的接口可以一起工作(如旧系统接口适配新框架)。

       装饰器模式:动态给对象添加功能(如给文本编辑器增加 “加粗”“斜体” 功能)。

       代理模式:为对象提供代理(如远程代理、权限代理)。

       外观模式:为复杂系统提供简单接口(如智能家居的 “一键场景” 封装多个设备操作)。

       桥接模式:分离抽象与实现,使二者可独立变化(如跨平台 UI 框架:抽象 “按钮”,实现 “Windows 按钮”“Linux 按钮”)。

       组合模式:将对象组合成树形结构,统一处理单个对象和组合对象(如文件系统的 “文件” 和 “文件夹”)。

       享元模式:复用大量相似对象,节省资源(如游戏中重复出现的道具、粒子效果)。

(3)行为型模式(11 种)

解决 “对象之间的交互与职责分配” 问题,优化协作逻辑。

       策略模式:定义算法家族,动态切换(如电商的多种折扣计算方式)。

       模板方法模式:定义流程骨架,子类实现具体步骤(如做饭:固定 “备料→烹饪→装盘”,子类实现 “做川菜”“做粤菜”)。

       观察者模式:对象状态变化时,自动通知依赖它的对象(如公众号推送、事件监听)。

       迭代器模式:提供遍历集合的统一接口(如 Python 的for循环遍历列表、字典)。

       责任链模式:将请求传递给多个处理器,直到被处理(如审批流程:员工→经理→总监)。

       命令模式:将操作封装为对象,支持撤销、排队(如遥控器按钮控制家电)。

       备忘录模式:保存对象状态,以便恢复(如游戏存档、文档撤销功能)。

       状态模式:对象状态变化时,行为随之改变(如订单状态:待支付→已支付→已发货)。

       访问者模式:在不修改类的前提下,增加对类的新操作(如报表生成工具访问不同数据对象)。

       中介者模式:用中介者减少对象间的直接耦合(如聊天室的服务器转发消息)。

       解释器模式:定义语言语法的解释器(如正则表达式解析器、公式计算器)。

单例:

一个类只有一个实例,全局访问,节省内存

一般对象创建

class tools:
    msg="I am OK"
    def shout():
        print(msg)


# 调用创建两个对象,需要消耗两块内存空间
obj_1 = tools()
obj_1.shout()

obj_2 = tools()
obj_2.shout()

单例对象创建

class tools:
    msg="I am OK"
    def shout():
        print(msg)

# 调用创建1个对象,需要消耗1块内存空间
tool=tools()

obj_1 = tool
obj_1.shout()

obj_2 = tool
obj_2.shout()

工厂:

不直接使用类创建对象,通过创建一个工厂函数调用类创建对象,统一创建对象入口,方便修改维护

class 类1:
    pass
class 类2:
    pass
class 类3:
    pass

def 工厂函数名(目标类名):
    if 类1==目标类名:
        return 类1()
    elif 类2==目标类名:
        return 类2()
    else:
        return 类3()

# 调用
工厂函数名(类1)


网站公告

今日签到

点亮在社区的每一天
去签到