概念
设计模式(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)