python - 编程中【工厂模式】和【单例模式】区别以及代码示例详解

一. 概念

工厂模式和单例模式都是面向对象编程中常用的设计模式。

  1. 工厂模式(FactoryPattern):是一种创建型模式,它提供了一种方法来创建对象,而不需要暴露对象的创建逻辑。这种模式通过定义一个工厂类,通过工厂方法来创建对象。工厂模式可以将对象的创建过程独立到一个单独的工厂类中,从而实现解耦,降低系统的耦合性,并提高系统的可扩展性和可维护性。工厂模式包括简单工厂模式、工厂方法模式和抽象工厂模式等。
  2. 单例模式(Singleton Pattern):是一种创建型模式,它保证一个类只有一个实例,并提供一个全局访问点,让外界能够访问到这个实例。单例模式可以避免系统中出现过多的重复对象,从而提高系统的性能和效率。确保一个类只有一个实例存在,从而实现对象的共享和控制对象的创建,同时可以提高系统性能。

二. 区别

  1. 目的不同:工厂模式的主要目的是将对象的创建过程独立到一个单独的工厂类中,从而实现解耦,降低系统的耦合性,并提高系统的可扩展性和可维护性;而单例模式的主要目的是确保一个类只有一个实例存在,从而实现对象的共享和控制对象的创建。

  2. 返回值不同:工厂模式通常会返回一个新的对象实例,而单例模式则会返回同一个实例。

  3. 实现方式不同:工厂模式通常会定义一个工厂类,用于创建对象,可以根据不同的参数值来创建不同的对象实例;而单例模式则需要在类中定义一个静态成员对象,通过调用类的静态方法来获取这个对象实例。

三. 示例代码

1. 工厂模式

示例代码

class Car:def __init__(self, brand):self.brand = branddef run(self):print(f'{self.brand} car is running')class CarFactory:def create(self, brand):return Car(brand)car_factory = CarFactory()
car1 = car_factory.create('BMW')
car1.run()
car2 = car_factory.create('Benz')
car2.run()
print(car1 is car2)

运行结果

在这里插入图片描述

可以看到以上运行的结果,实例对象传进去的参数输出都是独立的,并且对象也都是不一样的。

2. 单例模式

示例代码

在类的内部,定义了一个实例变量 __instance,并重写了 __new__ 方法来控制实例的创建。在实例化该类的时候,如果实例对象不存在,则创建该实例对象,否则直接返回实例对象。

class Singleton:__instance = Nonedef __new__(cls):if not cls.__instance:cls.__instance = super().__new__(cls)return cls.__instancedef __init__(self):self.at = Falsedef set_at(self, a):if a:self.at = Trueelse:self.at = Falseif __name__ == '__main__':s1 = Singleton()s2 = Singleton()print('s1 is s2 --->', s1 == s2)  # Trues1.set_at(0)print('set s1 at -->', s1.at)print('s2 at ------>', s2.at)s2.set_at(1)print('set s2 at -->', s2.at)print('=====================')print('s1 at -->', s1.at)print('s2 at -->', s2.at)

运行结果

在这里插入图片描述
从以上运行结果我们可以看到,两个实列s1和s2创建之后是指向同一个对象的,在设置属性时也是以最后的实例设置的结果为准,这样就可以实现数据的同步与共享了。

四. 附上其他单例模式几种写法

1. 使用模块方式实现单例模式

Python中加载模块时会缓存,所以在导入一个模块时,不管导入多少次,都只会创建一个实例。

# singleton.py
class Singleton:def __init__(self):passsingleton = Singleton()# main.py
from singleton import singletons1 = singleton
s2 = singleton
print(s1 is s2)  # 输出 True

2. 使用装饰器实现单例模式

def singleton(cls):instances = {}def get_instance(*args, **kwargs):if cls not in instances:instances[cls] = cls(*args, **kwargs)return instances[cls]return get_instance@singleton
class MyClass:pass

3. 使用元类实现单例模式

元类是Python中比较高级的概念,我们可以通过定义一个元类,并在该元类的__call__()方法中判断类是否已经被实例化,从而实现单例模式。

class SingletonMeta(type):_instances = {}def __call__(cls, *args, **kwargs):if cls not in cls._instances:cls._instances[cls] = super().__call__(*args, **kwargs)return cls._instances[cls]class MyClass(metaclass=SingletonMeta):passs1 = MyClass()
s2 = MyClass()print(s1 == s2)   # 输出True

在上面的代码中,我们创建了一个元类 SingletonMeta,它继承自 type 类,同时重写了 __call__ 方法。__call__ 方法在创建实例的时候被调用,我们重写了该方法来控制实例的创建。在实例化 Singleton 的时候,会自动调用元类中的 __call__ 方法,创建实例对象。

五. 总结

工厂模式和单例模式是两种不同的设计模式,它们的目的和实现方式都有所不同。工厂模式主要用于对象的创建,单例模式则主要用于对象的共享。在实际应用中,我们可以根据具体的需求和场景进行选择。

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

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

相关文章

远程端口转发 实践 如何将物理机某一端口的服务转发到vps上,使得外网能访问到

以本机1470端口(我的sqli-labs)与vps的9023端口为例。 SSH基本的连接命令是: ssh usernamehostname这里牵扯到了两台主机,一是执行命令、运行SSH客户端的主机,我们称为本地主机A【Host A】;二是接收连接请…

小程序运营方式有哪些?如何构建小程序运营框架?

​如今,每个企业基本都做过至少一个小程序,但由于小程序本身不具备流量、也很少有自然流量,因此并不是每个企业都懂如何运营小程序。想了解小程序运营方式方法有哪些? 在正式运营小程序前,了解小程序的功能与企业实际经…

Heikin Ashi最简单的一种烛台移动平均线

是不是每次进行交易的时候,市场上的各种新闻真真假假,搞的交易者每次都分不清楚,今天FPmarkets澳福给各位投资者推荐一种交易策略——“Heikin Ashi” “Heikin Ashi”只通过四个参数构建:开盘价、收盘价、最高价和最低价(最大和…

ssm汽车养护管理系统源码和论文

ssm汽车养护管理系统038 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 开题报告内容:(研究现状、目的意义;基本内容、研究方法、参考文献等。) 研究现状 国外…

chapter 3 Free electrons in solid - 3.1 自由电子模型

3.1 自由电子模型 Free electron model 研究晶体中的电子: 自由电子理论:不考虑离子实能带理论:考虑离子实(周期性势场)的作用 3.1.1 德鲁德模型 Drude Model - Classical Free Electron Model (1)德鲁德模型 德鲁…

golang 协程的实现原理

核心概念 要理解协程的实现, 首先需要了解go中的三个非常重要的概念, 它们分别是G, M和P, 没有看过golang源代码的可能会对它们感到陌生, 这三项是协程最主要的组成部分, 它们在golang的源代码中无处不在. G (goroutine) G是goroutine的头文字, goroutine可以解释为受管理的…

React(7)

1.React Hooks 使用hooks理由 1. 高阶组件为了复用,导致代码层级复杂 2. 生命周期的复杂 3. 写成functional组件,无状态组件 ,因为需要状态,又改成了class,成本高 1.1 useState useState();括号里面处的是初始值;返回的是一个…

2023年大数据与区块链国际会议 | EI、Scoups检索

会议简介 Brief Introduction 2023年大数据与区块链国际会议(ICBDB 2023) 会议时间:2023年11月17 -19日 召开地点:中国西安 大会官网:www.icobdb.org 2023年大数据与区块链国际会议(ICBDB 2023)…

论文及代码详解——Restormer

文章目录 论文详解Overall pipelineMulti-Dconv Head Transposed AttentionGated-Dconv Feed-Forward Network 代码详解 论文:《Restormer: Efficient Transformer for High-Resolution Image Restoration》 代码:https://github.com/swz30/Restormer 论…

Jmeter常用线程组设置策略

一、前言 ​ 在JMeter压力测试中,我们时常见到的几个场景有:单场景基准测试、单场景并发测试、单场景容量测试、混合场景容量测试、混合场景并发测试以及混合场景稳定性测试 在本篇文章中,我们会用到一些插件,在这边先给大家列出&…

Git问题:解决“ssh:connect to host github.com port 22: Connection timed out”

操作系统 Windows11 使用Git IDEA 连接方式:SSH 今天上传代码出现如下报错:ssh:connect to host github.com port 22: Connection timed out 再多尝试几次,依然是这样。 解决 最终发现两个解决方案:(二选一&#xf…

Django实现音乐网站 ⒀

使用Python Django框架制作一个音乐网站, 本篇主要是推荐页-推荐排行榜、推荐歌手功能开发。 目录 推荐页开发 推荐排行榜 单曲表增加播放量 表模型增加播放量字段 执行表操作 模板中显示外键对应值 表模型外键设置 获取外键对应模型值 推荐排行榜视图 推…

SpringBoot ⽇志⽂件

文章目录 日志有什么用?spring boot中日志怎么用?选择日志框架添加依赖配置日志在代码中使用日志 自定义日志打印日志级别的分类与使用日志持久化 日志有什么用? 在Spring Boot应用程序中,日志文件具有以下重要用途: …

HVV爆火漏洞:最新 WPS RCE (远程命令执行) 复现

最近HVV爆出的很火的WPS命令执行漏洞&#xff0c;其实并不是0DAY&#xff0c;早在2019年就出现了&#xff0c;只不过最近EXP才公开。接下来我们来复现一遍。 0x00 影响版本 WPS Office 2023 个人版 < 11.1.0.15120WPS Office 2019 企业版 < 11.8.2.12085 0x01 环境配置…

律师事务所微信小程序开发方案:实现智能化服务与用户体验的完美结合

随着移动互联网的快速发展&#xff0c;微信成为了人们日常生活中不可或缺的社交工具。为了满足用户对便捷、高效法律服务的需求&#xff0c;律师事务所微信小程序应运而生。本文将探讨律师事务所微信小程序的开发方案&#xff0c;旨在为读者提供一个专业、思考深度和逻辑性的指…

Zabbix监控系统最新版安装

setenforce 0 设置SELinux 成为permissive模式 临时关闭selinux的 [rootwww yum.repos.d]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo % Total % Received % Xferd Average Speed Time Time Time Current …

(三)行为模式:1、责任链模式(Chain of Responsibility Pattern)(C++示例)

目录 1、责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;含义 2、责任链模式的UML图学习 3、责任链模式的应用场景 4、责任链模式的优缺点 5、C实现责任链模式的实例 1、责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;含义 责任…

Webpack node、output.jsonpFunction 配置详解

Webpack node、output.jsonpFunction 配置详解 最近尝试给一些用到 webpack 的项目升级到最新 webpack5 版本&#xff0c;其中遇到了一些问题&#xff0c;我挑了两个比较典型的问题&#xff0c;其中主要涉及到了 webpack 的 node 属性跟 output.jsonpFunction &#xff08;web…

变压器绝缘油介质损耗因素测试

试验目的 变压器油又称绝缘油&#xff0c;是一种电介质&#xff0c;是能够耐受电应力的绝缘体。当对介质油施加交流电压时&#xff0c;所通过的电流与其两端的电压相位差并不是90度角&#xff0c;而是比90度角要小一个δ角的&#xff0c;此δ角称为油的介质损耗角。变压器油的…

Linux入门

一、安装相关软件 1.下载vmware (很容易下载,搜一下官网 ) 在cmd敲入 ncpa.cpl &#xff0c;查看下面这两个。 2.下载centos 下面是镜像源网站&#xff0c;当然你可以选择其他的镜像源&#xff0c;像清华镜像源和阿里镜像源。 Index of /centos/7.9.2009/isos/x86_64/ | …