Python之设计模式

news2024/11/27 0:19:19

一、设计模式_工厂模式实现

image-20211116182146723

设计模式是面向对象语言特有的内容,是我们在面临某一类问题时候固定的做法,设计模式有很多种,比较流行的是:GOF(Goup Of Four)23种设计模式。当然,我们没有必要全部学习,学习几个常用的即可。

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

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

image-20211116181514941

#工厂模式
​
class CarFactory:
  def createCar(self,brand):
    if brand == "奔驰":
      return Benz()
    elif brand == "宝马":
      return BMW()
    elif brand == '比亚迪':
      return BYD()
    else:
      return "未知品牌,无法创建"
​
​
class Benz:
  pass
​
​
class BMW:
  pass
​
​
class BYD:
  pass
​
factory = CarFactory()
c1 = factory.createCar("奔驰")
c2 = factory.createCar("宝马")
print(c1)
print(c2)

 运行结果:

<__main__.Benz object at 0x021C5770>
<__main__.BMW object at 0x021C5790>

 

二、设计模式_单例模式实现

image-20211116181724181

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

单例模式只生成一个实例对象,减少了对系统资源的开销。当一个对象的产生需要比较多的资源,如读取配置文件、产生其他依赖对象时,可以产生一个“单例对象”,然后永久驻留内存中,从而极大的降低开销。

⚠️单例模式有多种实现的方式,我们这里推荐重写__new__()的方法。

#单例模式
​
class MySingleton:
  __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 MySingleton.__init_flag:
      print("init....")
      self.name = name
      MySingleton.__init_flag = False
​
a = MySingleton("aa")
print(a)
b = MySingleton("bb")
print(b)

 运算结果:

init....
<__main__.MySingleton object at 0x01E15610>
<__main__.MySingleton object at 0x01E15610>

三、工厂和单例模式结合

image-20211116181840301

设计模式称之为“模式”,就是一些固定的套路。我们很容易用到其他场景上,比如前面讲的工厂模式,我们需要将工厂类定义成“单例”,只需要简单的套用即可实现:

#测试工厂模式和单例模式的整合使用
class CarFactory:
  __obj = None      #类属性
  __init_flag = True
​
​
  def create_car(self,brand):
    if brand =="奔驰":
      return Benz()
    elif brand =="宝马":
      return BMW()
    elif brand == "比亚迪":
      return BYD()
    else:
      return "未知品牌,无法创建"
​
​
  def __new__(cls, *args, **kwargs):
    if cls.__obj ==None:
      cls.__obj = object.__new__(cls)
​
    return cls.__obj
​
  def __init__(self):
    if CarFactory.__init_flag:
      print("init CarFactory....")
      CarFactory.__init_flag = False
​
class Benz:
  pass
​
class BMW:
  pass
​
class BYD:
  pass
​
factory = CarFactory()
c1 = factory.create_car("奔驰")
c2 = factory.create_car("比亚迪")
print(c1)
print(c2)
​
factory2 = CarFactory()
print(factory)
print(factory2)

 运算结果:

init CarFactory....
<__main__.Benz object at 0x01E36E90>
<__main__.BYD object at 0x01E36C30>
<__main__.CarFactory object at 0x01E36730>
<__main__.CarFactory object at 0x01E36730>

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

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

相关文章

kafka实战报错解决问题

需求 在一个在线商城中&#xff0c;用户下单后需要进行订单的处理。为了提高订单处理的效率和可靠性&#xff0c;我们使用Kafka来实现订单消息的异步处理。当用户下单后&#xff0c;订单信息会被发送到Kafka的一个Topic中&#xff0c;然后订单处理系统会从该Topic中消费订单消…

企业架构LNMP学习笔记29

Nginx负载均衡配置&#xff1a; 架构分析&#xff1a; 1&#xff09;用户访问请求Nginx负载均衡服务器&#xff1b; 2&#xff09;Nginx负载均衡服务器再分发请求到Web服务器。 实际配置负载均衡&#xff0c;只需修改作为负载均衡服务器的Nginx即可&#xff0c;当前架构中的…

Mapper传递参数的方法

目录 方法1&#xff1a;顺序传参法 方法2&#xff1a;Param注解传参法 方法3&#xff1a;Map传参法 方法4&#xff1a;Java Bean传参法 方法1&#xff1a;顺序传参法 public User selectUser(String name, int deptId);<select id"selectUser" resultMap&quo…

一篇文章教会你什么是高度平衡二叉搜索(AVL)树

高度平衡二叉搜索树 AVL树的概念1.操作2.删除3.搜索4.实现描述 AVL树的实现1.AVL树节点的定义2.AVL树的插入3.AVL树的旋转3.1 新节点插入较高右子树的右侧---右右:左单旋3.2 新节点插入较高左子树的左侧---左左:右单旋3.3 新节点插入较高左子树的右侧---左右&#xff1a;先左单…

【牛客面试必刷TOP101】Day3.BM10两个链表的第一个公共结点和BM13判断一个链表是否为回文结构

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;牛客面试必刷TOP101 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&…

机器学习入门教学——决策树

1、简介 决策树算法是一种归纳分类算法&#xff0c;它通过对训练集的学习&#xff0c;挖掘出有用的规则&#xff0c;用于对新数据进行预测。决策树算法属于监督学习方法。决策树归纳的基本算法是贪心算法&#xff0c;自顶向下来构建决策树。 贪心算法&#xff1a;在每一步选择…

LeetCode-80. 删除有序数组中的重复项 II-⭐⭐

给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 提示&…

解决vue3类型“{}”上不存在属性

刚创建的一个Vue3和Ts的项目&#xff0c;结果使用Vscode打开后&#xff0c;修改了index.vue文件就报错了: 修改tsconfig.json文件 在tsconfig.json文件中添加一行代码&#xff1a;就是让ts识别vue文件 "include": ["src/**/*.ts", "src/**/*.d.ts&q…

机器学习入门教学——过拟合、欠拟合、模型验证、样本拆分

1、过拟合 定义 过拟合指的是模型对训练数据拟合的太好&#xff0c;以至于无法很好地泛化到新数据。原因 训练数据不足模型太复杂&#xff08;如深层神经网络&#xff09;训练时间太长后果 模型在训练数据上表现良好&#xff0c;但在测试数据上表现较差。解决方法 增加训练数据…

今天,外滩大会“开发者创新营地”成为技术爱好者打卡点

9月9日&#xff0c;上海&#xff0c;黄浦江边。室外温度31度&#xff0c;依然挡不住技术爱好者们的热情&#xff01;他们涌入了外滩大会最值得期待的打卡点&#xff1a;开发者创新营地。 开发者创新营地是本次外滩大会搭建的技术人交流平台&#xff0c;以闪电演讲&#xff08;…

山西电力市场日前价格预测【2023-09-10】

日前价格预测 预测明日&#xff08;2023-09-10&#xff09;山西电力市场全天平均日前电价为359.80元/MWh。其中&#xff0c;最高日前电价为412.31元/MWh&#xff0c;预计出现在18: 45。最低日前电价为322.32元/MWh&#xff0c;预计出现在13: 45。 价差方向预测 1&#xff1a; 实…

【实例项目:基于多设计模式下的日志系统(同步异步)】

一、项目简介 1.日志的概念&#xff08;白话版&#xff09; 日志类似于日记&#xff0c;通常是指对完成某件事情的过程中状态等的记录&#xff0c;而计算机中的日志是指日志数据&#xff0c;是有价值的信息宝库&#xff0c;各种操作系统、应用程序、设备和安全产品的日志数据能…

Baichuan2开源大模型正式发布,王小川:性能超过LLaMA2

大数据产业创新服务媒体 ——聚焦数据 改变商业 ChatGPT火爆出圈之后&#xff0c;社交巨头Meta奋力追赶&#xff0c;分别在3月、7月发布开源的LLaMA、LLaMA2大模型&#xff0c;引领一场大模型开源运动。 LLaMA2大模型&#xff0c;包含了70亿、130亿、700亿参数三个版本&#x…

对Transformer中的Attention(注意力机制)的一点点探索

摘要&#xff1a;本文试图对 Transformer 中的 Attention 机制进行一点点探索。并就 6 个问题深入展开。 ✅ NLP 研 1 选手的学习笔记 简介&#xff1a;小王&#xff0c;NPU&#xff0c;2023级&#xff0c;计算机技术 研究方向&#xff1a;文本生成、摘要生成 文章目录 一、为啥…

强大的JTAG边界扫描(3):常用边界扫描测试软件

文章目录 1. 功能强大的XJTAG2. 小巧简洁的TopJTAG3. TopJTAG安装4. TopJTAG基本使用 本文介绍两款常用的边界扫描测试软件&#xff1a;XJTAG和TopJTAG&#xff0c;前者收费、功能强大&#xff0c;后者免费&#xff08;和谐后&#xff09;&#xff0c;功能简洁。 如果只是要进…

深入探讨梯度下降:优化机器学习的关键步骤(三)

文章目录 &#x1f340;引言&#x1f340;随机、批量梯度下降的差异&#x1f340;随机梯度下降的实现&#x1f340;随机梯度下降的调试 &#x1f340;引言 随机梯度下降是一种优化方法&#xff0c;主要作用是提高迭代速度&#xff0c;避免陷入庞大计算量的泥沼。在每次更新时&a…

【图神经网络 01】

图的基本构成&#xff1a; V&#xff1a;Vertex (or node) attributes E&#xff1a;Edge (or link) attributes and directions U&#xff1a;Global (or master node) attributes 图的邻接矩阵&#xff1a;文本数据也可以表示图的形式&#xff0c;邻接矩阵表示的连接关系。 以…

计算机竞赛 基于深度学的图像修复 图像补全

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学的图像修复 图像补全 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-se…

牛客网项目-第一章-笔记

牛客网项目-第一章 环境配置 java maven idea Spring Intializr 搜索jar包的网站&#xff1a;https://mvnrepository.com/ https://start.spring.io/ 缺少的aop包&#xff0c;手动在pom.xml中加入依赖 <dependency><groupId>org.springframework.boot</gro…

OpenRoads Designer导入文本格式水平路线、路线纵断面

ORD可以用以文本文件进行定义水平几何路线及纵断面几何路线直接导入来完成几何路线的定义&#xff1a; 水平路线 平面几何路线示例 “平面几何路线.txt”文件内容&#xff1a; BP-1,54376.169,1816.914 BP,54376.101,1817.912 JD01,54358.369,2081.452,0 JD02,54810.789,477…