什么是设计模式,举例说明Python中的常见设计模式

什么是设计模式,举例说明Python中的常见设计模式

设计模式是一种在软件设计中对常见问题的通用解决方案。它们是在软件开发中积累的宝贵经验,可以帮助开发者更快速、更高效地编写高质量、可维护的代码。设计模式通常包含一些类和接口,以及它们之间的交互方式,这些交互方式可以解决某些特定的问题。

在Python中,有很多常见的设计模式,以下是一些例子:

  1. 单例模式(Singleton Pattern)
    单例模式确保一个类仅有一个实例,并提供一个全局访问点。

 

python复制代码

class Singleton:
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(Singleton, cls).__new__(cls)
return cls._instance
# 使用
singleton_obj = Singleton()
  1. 工厂模式(Factory Pattern)
    工厂模式用于创建对象,隐藏了对象的具体创建过程,调用者只需关心接口,不关心具体实现。

 

python复制代码

class Shape:
def draw(self):
pass
class Circle(Shape):
def draw(self):
return "Inside Circle::draw() method."
class Rectangle(Shape):
def draw(self):
return "Inside Rectangle::draw() method."
def shape_factory(shape_type):
if shape_type == "CIRCLE":
return Circle()
elif shape_type == "RECTANGLE":
return Rectangle()
# 使用
circle = shape_factory("CIRCLE")
circle.draw()
  1. 观察者模式(Observer Pattern)
    定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象状态发生改变时,它的所有依赖者(观察者)都会收到通知并自动更新。

 

python复制代码

class Subject:
def __init__(self):
self._observers = []
self._state = 0
def attach(self, observer):
self._observers.append(observer)
def detach(self, observer):
self._observers.remove(observer)
def notify(self):
for observer in self._observers:
observer.update(self._state)
def set_state(self, state):
self._state = state
self.notify()
class Observer:
def update(self, state):
pass
# 使用
subject = Subject()
observer = Observer()
subject.attach(observer)
subject.set_state(1)
  1. 策略模式(Strategy Pattern)
    定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换。策略模式使得算法可以独立于使用它的客户端变化。

 

python复制代码

class Strategy:
def execute(self):
pass
class ConcreteStrategyA(Strategy):
def execute(self):
return "Strategy A"
class ConcreteStrategyB(Strategy):
def execute(self):
return "Strategy B"
class Context:
def __init__(self, strategy):
self.strategy = strategy
def set_strategy(self, strategy):
self.strategy = strategy
def execute_strategy(self):
return self.strategy.execute()
# 使用
context = Context(ConcreteStrategyA())
print(context.execute_strategy()) # 输出: Strategy A
context.set_strategy(ConcreteStrategyB())
print(context.execute_strategy()) # 输出: Strategy B

这些只是设计模式中的一部分,设计模式种类繁多,每种设计模式都有其特定的应用场景和优点。在实际开发中,根据具体需求和场景选择合适的设计模式,可以提高代码的可维护性、可扩展性和可重用性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/739388.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

排序算法的对比

类别排序方法时间复杂度空间复杂度稳定性平均情况最好的情况最坏的情况 插入 排序 插入排序稳定希尔排序不稳定 选择 排序 选择排序不稳定堆排序不稳定 交换 排序 冒泡排序稳定快速排序不稳定归并排序稳定基数排序稳定

git for windows

记录,git svn混用,检出代码时出错及解决方案, 执行命令: git svn clone svn_project_url 报错: certificate problem.(R)eject,accept (t)emporarily or accept (p)ermanently 解决: 在弹框中 输入P …

记录一个编译的LLVM 含clang 和 PTX 来支持 HIPIFY 的构建配置

llvm 18 debug 版本 build llvmorg-18.1rc4 debug $ cd llvm-project $ git checkout llvmorg-18.1.0-rc4 $ mkdir build_d $ cd build_d $ mkdir -p ../../local_d cmake \ -DCMAKE_INSTALL_PREFIX../../local_d \ -DLLVM_SOURCE_DIR../llvm \ -DLLVM_ENABLE_PROJECTS&…

平台工程:构建企业数字化转型的基石

有人说,平台工程(Platform Engineering),不过是新瓶装旧酒(DevOps)。 而Gartner 将平台工程列为 2024 顶级战略技术趋势之一。我国信通院也开始陆续制定与平台工程相关的技术标准。 随着数字化浪潮的席卷…

【LV15 day10 信号量 互斥锁】

一、信号量:基于阻塞的并发控制机制 a.定义信号量 struct semaphore sem; b.初始化信号量 void sema_init(struct semaphore *sem, int val); c.获得信号量P int down(struct semaphore *sem);//深度睡眠 int down_interruptible(struct semaphore *sem);//浅度…

【数学】【网格】【状态压缩】782 变为棋盘

作者推荐 视频算法专题 本文涉及知识点 数学 网格 状态压缩 LeetCode:782 变为棋盘 一个 n x n 的二维网络 board 仅由 0 和 1 组成 。每次移动,你能任意交换两列或是两行的位置。 返回 将这个矩阵变为 “棋盘” 所需的最小移动次数 。如果不存在可行的变换&am…

Git是一个分布式版本控制系统 一.2

Git是一个分布式版本控制系统,用于跟踪和管理代码的变化。它最初由Linus Torvalds于2005年创建,并成为开源社区中最流行的版本控制系统之一。 Git的主要特点包括: 分布式:每个开发者都可以在本地拥有完整的代码仓库,并…

day08_Mybatis

文章目录 前言一、快速入门1.1 入门程序分析1.2 入门程序实现1.2.1 准备工作1.2.1.1 创建springboot工程1.2.1.2 数据准备 1.2.2 配置Mybatis1.2.3 编写SQL语句1.2.4 单元测试1.3 解决SQL警告与提示 二、JDBC介绍2.1 介绍2.2 代码2.3 问题分析2.4 技术对比 三、数据库连接池3.1…

c语言经典测试题12

1.题1 float f[10]; // 假设这里有对f进行初始化的代码 for(int i 0; i < 10;) { if(f[i] 0) break; } 上述代码有那些缺陷&#xff08;&#xff09; A: for(int i 0; i < 10;)这一行写错了 B: f是float型数据直接做相等判断有风险 C: f[i]应该是f[i] D: 没有缺…

CentOS 7 基于官方源码制作openssh 9.7p1 rpm包(without ssl)—— 筑梦之路

2024年3月11日&#xff0c;openssh 发布9.7 p1版本&#xff0c;这里在centos7 x86_64系统上来进行制作适用于centos 7 redhat 7 x86_64操作系统的openssh 9.7版本rpm包。 特别说明&#xff1a;9.6版本以后官方不再使用openssl&#xff0c;因此安装后ssh -V 查看会显示without …

各种环境下载链接

多环境镜像站 https://developer.aliyun.com/mirror/?spma2c6h.25603864.0.0.75fb4dda6bhioC http://mirrors.163.com/ http://mirrors.ustc.edu.cn/ http://mirrors.zju.edu.cn/ debeaver https://dbeaver.io/download/ mysql https://downloads.mysql.com/archives/comm…

【YOLOv8模型网络结构图理解】

YOLOv8模型网络结构图理解 1 YOLOv8的yaml配置文件2 YOLOv8网络结构2.1 Conv2.2 C3与C2f2.3 SPPF2.4 Upsample2.5 Detect层 1 YOLOv8的yaml配置文件 YOLOv8的配置文件定义了模型的关键参数和结构&#xff0c;包括类别数、模型尺寸、骨干&#xff08;backbone&#xff09;和头部…

谷歌seo外链重要还是内容重要?

想做网站&#xff0c;内容跟外链缺一不可&#xff0c;如果真的要说哪个更重要&#xff0c;那内容依旧是网站的核心&#xff0c;而外链则是额外的加分项 内容永远是王道&#xff0c;不管谷歌seo的算法怎么变&#xff0c;只要你的内容没问题&#xff0c;那就肯定不会牵扯到你的网…

【蓝桥杯】分糖果(DFS)

问题描述 两种糖果分别有 9个和 16 个&#xff0c;要全部分给 7 个小朋友&#xff0c;每个小朋友得到的糖果总数最少为 2个最多为 5 个&#xff0c;问有多少种不同的分法。糖果必须全部分完。 只要有其中一个小朋友在两种方案中分到的糖果不完全相同&#xff0c;这两种方案就…

Oracle 配置多个缓冲池(Keep pool Recycle Pool)

默认情况下&#xff0c;Oracle只有一个缓冲池 - Buffer Cache&#xff0c;其可以满足基本数据缓存需求。但某些数据的访问模式可能与普通数据不同&#xff0c;对于访问非常频繁的数据和很少访问的数据&#xff08;两种极端&#xff09;&#xff0c;Oracle可以支持配置两个独立的…

“312血洗四周年”!比特币冲破7.2万创新高!手持华尔街资金与减半叙事,跃升为全球第8大资产!

在过去一周时间里&#xff0c;比特币三次突破了2021年11月的历史高点。周一&#xff0c;加密市场延续涨势&#xff0c;比特币涨至72000美元以上&#xff0c;盘中一度触及72800美元&#xff0c;以太坊攀升至4000美元以上。 随着比特币再次创下新纪录&#xff0c;其市值已突破1.4…

python基础及网络爬虫

网络爬虫(Web crawler)&#xff0c;有时候也叫网络蜘蛛(Web spider)&#xff0c;是指这样一类程序——它们可以自动连接到互联网站点&#xff0c;并读取网页中的内容或者存放在网络上的各种信息&#xff0c;并按照某种策略对目标信息进行采集&#xff08;如对某个网站的全部页面…

记录一下C++的学习之旅吧--C++基础

文章目录 前言using namespace std; 使用标准命名空间一、helloworld-输出表示1.1代码1.2 运行结果 二、变量2.1.1 普通变量代码2.1.2 运行结果2.2.1 常量和变量代码2.2.2 运行结果 三、sizeof---统计数据类型所占的内存大小3.1 代码3.2 运行结果 四、小数表示4.2 运行结果 五、…

基于React低代码平台开发:直击最新高效应用构建

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java对AI的调用开发》 《RabbitMQ》《Spring》《SpringMVC》《项目实战》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录…

C#使用自定义的节点类Node(int data)实现二叉树类BinaryTree及其方法

目录 一、涉及到的知识点 1.树结构 2.树结构的数据类型定义 &#xff08;1&#xff09;结构定义 &#xff08;2&#xff09;基本操作 3.二叉树 &#xff08;1&#xff09;定义和特点 &#xff08;2&#xff09;遍历二叉树的输出结果 二 、二叉树的实例 一、涉及到的知…