如何在Python中实现设计模式?

如何在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()
another_obj = Singleton()
print(singleton_obj is another_obj) # 输出:True

2. 工厂模式(Factory Pattern)

工厂模式用于创建对象,它隐藏了对象创建的具体细节,客户端不再需要关心所需的具体类是哪一个。

 

python复制代码

class Car:
def __init__(self, brand):
self.brand = brand
class CarFactory:
@staticmethod
def create_car(brand):
if brand == 'Toyota':
return ToyotaCar(brand)
elif brand == 'Honda':
return HondaCar(brand)
else:
return Car(brand)
# 使用
factory = CarFactory()
toyota = factory.create_car('Toyota')
honda = factory.create_car('Honda')

3. 观察者模式(Observer Pattern)

观察者模式定义了对象之间的一对多依赖关系,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

 

python复制代码

class Observer:
def update(self, subject):
pass
class Subject:
def __init__(self):
self.observers = []
self.state = None
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)
def set_state(self, state):
self.state = state
self.notify()
# 使用
class BinaryObserver(Observer):
def update(self, subject):
print(f"Binary: {bin(subject.state)}")
subject = Subject()
observer = BinaryObserver()
subject.attach(observer)
subject.set_state(10) # 输出:Binary: 0b1010

4. 建造者模式(Builder Pattern)

建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

 

python复制代码

class Product:
def __init__(self, parts):
self.parts = parts
class Builder:
def __init__(self):
self.reset()
def reset(self):
self._parts = []
def add(self, part):
self._parts.append(part)
def get_result(self):
return Product(self._parts)
# 使用
builder = Builder()
builder.add("PartA")
builder.add("PartB")
product = builder.get_result()
print(product.parts) # 输出:['PartA', 'PartB']

5. 策略模式(Strategy Pattern)

策略模式定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换。策略模式使得算法可以独立于使用它的客户端变化。

 

python复制代码

class SortingStrategy:
def sort(self, data):
pass
class BubbleSort(SortingStrategy):
def sort(self, data):
# Bubble sort implementation
pass
class QuickSort(SortingStrategy):
def sort(self, data):
# Quick sort implementation
pass
# 使用
data = [64, 34, 25, 12, 22, 11, 90]
strategies = {'bubble': BubbleSort(), 'quick': QuickSort()}
strategy_name = 'bubble' # 可以替换为 'quick' 来改变排序策略
strategy = strategies[strategy_name]
strategy.sort(data)
print(data)

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

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

相关文章

多线程 线程池 Task

多线程概念?优点及缺点? 多线程是指程序中包含多个执行流(线程),即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。 概括&#x…

手写简易操作系统(二十五)--文件系统第三部分

前情提要 一、文件写入 1.1、file的写入 文件写入比较复杂,函数行数相当多 /*** description: 把buf中的count个字节写入file,成功则返回写入的字节数,失败则返回-1 * param {file*} file 文件* param {void*} buf 缓存* param {uint32_t} count 写入的字节数…

leetcode2009--使数组连续的最少操作数

1. 题意 给定一个数组,求最少的操作数使得数组连续。 每次操作你可选择一个数,将它变为任意其他数。 leetcode2009 2. 题解 思路:反向考虑,最多能保留多少个数字使得当前数组连续。 就变成了 [ x , x s z − 1 ] [x,xsz-1]…

基于Java+SpringBoot+Vue民宿预约管理系统(源码+文档+部署+讲解)

一.系统概述 随着社会的不断进步与发展,人们经济水平也不断的提高,于是对各行各业需求也越来越高。利用计算机网络来处理各行业事务这一概念更深入人心,由于工作繁忙以及其他的原因,到实体店进行预约也是比较难实施的。如果开发一…

es6新增加的语法

let和const关键字:let和const允许你声明具有块级作用域的变量和常量。这有助于避免使用var时可能出现的变量提升和全局污染问题。模板字符串:使用反引号()可以创建多行字符串和嵌入表达式。 javascript let name world; let greeting Hello, ${name}!…

迪拜公司怎么注册 迪拜公司注册优势 迪拜公司注册条件

一、迪拜公司注册优势 1、税收优势:迪拜是一个没有个人所得税、企业所得税和增 值税的地区,这为注册公司在迪拜提供了巨大的税收优势。 2、地理位置优势:迪拜位于东西方和南北方的交汇点,拥有得天独厚的地理位置。这使得迪拜成为…

LLM Agents调研

LLM Agents调研 1、从 Copilot 到 Agent2、Agent概述3、agent框架2.1 框架介绍2.2框架对比 4、应用场景3.1single-agent应用3.2multi-agent 应用 5、agent功能选型参考: 1、从 Copilot 到 Agent 参考:https://mp.weixin.qq.com/s/vVUO-WRkp8FS3wKcfgu45…

【Vue3 + ElementUI】表单校验无效(写法:this.$refs[‘formName‘].validate((valid) =>{} ))

一. 表单校验 1.1 template模块 el-form 中 若校验&#xff0c;ref 和 rules 必须要有 <template><div style"padding:20px"><el-form ref"formName" :model"form" :rules"formRules" label-width"120px"…

C++进阶之路---何为智能指针?

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、为什么需要智能指针&#xff1f; 下面我们先分析一下下面这段程序有没有什么内存方面的问题&#xff1f;提示一下&am…

AI技术的创业机会

AI技术创业有哪些机会&#xff1f; 人工智能&#xff08;AI&#xff09;技术作为当今科技创新的前沿领域&#xff0c;为创业者提供了广阔的机会和挑战。随着AI技术的快速发展和应用领域的不断拓展&#xff0c;未来AI技术方面会有哪些创业机会呢&#xff1f; 方向一&#xff1a…

Spring 之 IoC基于XML管理Bean

1. 环境搭建 参考我之前的笔记&#xff1a; Spring6 基础入门-CSDN博客 2. 获取Bean的方式 2.1 根据Id 获取 参考之前的笔记&#xff1a; Spring6 基础入门-CSDN博客 Testpublic void testGetBeanById(){//加载spring配置文件ApplicationContext context new ClassPathXmlA…

医疗图像分割 | 基于Pyramid-Vision-Transformer算法实现医疗息肉分割

项目应用场景 面向医疗图像息肉分割场景&#xff0c;项目采用 Pytorch Pyramid-Vision-Transformer 深度学习算法来实现。 项目效果 项目细节 > 具体参见项目 README.md (1) 模型架构 (2) 项目依赖&#xff0c;包括 python 3.8、pytorch 1.7.1、torchvision 0.8.2(3) 下载…

粤嵌教育:继续坚持诚信为本,分享合理投诉小妙招

在如今的教育市场中&#xff0c;诚信已经成为一个不可忽视的关键词。粤嵌教育作为一家有着深厚教育背景和丰富教学经验的培训机构&#xff0c;始终坚持诚信为本&#xff0c;以优质的教学服务赢得了广大学员和社会的认可。然而&#xff0c;在教育行业中&#xff0c;难免会遇到一…

C++:Stmt预处理SQL与大文件存取(五)

1、预处理相关API mysql_stmt_init&#xff1a;初始化生成一个预编译处理的Stmt对象mysql_stmt_prepare&#xff1a;预处理SQL语句&#xff0c;值部分用&#xff1f;进行占位&#xff08;可以防止SQL注入&#xff09;mysql_stmt_bind_param&#xff1a;给预处理的SQL语句中的&…

数据仓库实践

什么是数据仓库&#xff1f; 数据仓库是一个用于存储大量数据并支持数据分析与报告的系统。它通常用于集成来自不同来源的数据&#xff0c;提供一个统一的视图&#xff0c;以便进行更深入的分析和决策。 数据仓库的主要优势&#xff1f; 决策支持&#xff1a;为企业决策提供可靠…

渗透知识贴

文章目录 基础知识同源策略 常见web漏洞SQL注入漏洞 web中间件 基础知识 同源策略 同源策略是目前所有浏览器都实行的一种安全政策。A网页设置的 Cookie&#xff0c;B网页不能打开&#xff0c;除非这两个网页同源。所谓同源&#xff0c;是指&#xff1a;协议、端口、域名相同…

Windows Server 2008添加Web服务器(IIS)、WebDAV服务、网络负载均衡

一、Windows Server 2008添加Web服务器&#xff08;IIS&#xff09; &#xff08;1&#xff09;添加角色&#xff0c;搭建web服务器&#xff08;IIS&#xff09; &#xff08;2&#xff09;添加网站&#xff0c;关闭默认网页&#xff0c;添加默认文档 在客户端浏览器输入服务器…

面试算法-165-随机链表的复制

题目 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的原节点的值。新节…

前端saas化部署

在项目中难免会遇到一些特殊的需求&#xff0c;例如同一套代码需要同时部署上两个不同的域名A和B。A和B的不同之处仅在于&#xff0c;例如一些背景图片&#xff0c;logo&#xff0c;展示模块的不同&#xff0c;其他业务逻辑是和展示模块是完全一样的。此时我们当然可以考虑单独…

Python网络爬虫(六):油管视频评论

本文的思路是利用googleapiclient.discovery连接Google API服务,获取油管视频的评论。Google API可以为开发人员提供很多有用的工具和数据,使用起来也非常简单方便。注意,连接Google API服务需要设置代理,这里需要用到httplib2库,利用该库设置代理信息,然后传入googleapi…