首页 > 编程语言 >python,怎么用工厂模式设计代码?

python,怎么用工厂模式设计代码?

时间:2024-08-07 17:40:17浏览次数:18  
标签:body get python ip 代码 工厂 post self

工厂模式

打造工厂模式,需要抽象工厂和具体工厂。怎么理解?抽象工厂就是接口的定义,但不负责具体的实现。而具体工厂则需要负责定义的接口的实现。就好比你爸爸让你上街时带一瓶酱油,而具体买什么牌子的由你决定。”你爸爸让带一瓶酱油“就是接口的定义函数,这个函数只负责定义”要求“,而不负责实现,而实现是由你来做的,那你就是具体工厂、你爸爸就是抽象工厂。简单理解抽象工厂是提要求的人(其实代码里就是类class),具体工厂就是实现”要求“的人(代码类class)。

工厂模式的实现

我们现在有个任务,需要你完成一个get、post方法,进行数据和发送和接受。另外需要覆盖http、websocket、tcp三种协议。我们首先要明白虽然同样是发送数据、接受数据,但是要知道三种协议的实现方式有很大不同。如果实现都相同,也就不会产生三种协议了,对吧?

猛一听这个要求,是不是下意识觉得很困难。需要同时为http、websocket、tcp三种协议实现get、post方法,你可能会被困难吓住。而我要告诉你,实现这个一点都不难,我们使用工厂方法,对这个任务进行分解并设计,把大的困难,分解为一个个小任务,就简单了。下面我们开始做。

根据工厂模式,我们需要在具体实现前面,先去定义要求。我们的要求一共有两个,实现get、post。知道了要求,我们还知道定义要求是在抽象工厂里实现的。那就先写抽象工厂类,再把要求写到抽象工厂类里面,就算完成了。

from abc import ABCMeta, abstractmethod
#继承了metaclass=ABCMeta的类就会被python认定为抽象类
class Protocol(metaclass=ABCMeta):
    
    """@abstractmethod用来定义抽象方法,如果没有装饰符,那就是一个普通方法。
    为啥这么安排呢,这是因为一旦使用了@abstractmethod,在接下来的具体工厂里
    这个方法就会被强制要求实现,如果你不实现就会python报错。就像你不给你爸爸
    买酱油,就会挨打一样"""
    @abstractmethod
    def post(self, body):
        '''发送请求的接口'''
        #注意抽象方法不需要具体去实现,具体实现是在具体方法里完成,所以这里pass即可
        pass

    @abstractmethod
    def get(self):
        '''获取数据的接口'''
        pass

有了抽象工厂后,接下来我们就来实现具体工厂。即把post、get实现,使其真正能够发送和接受数据。

import requests
import socket
#http协议
#继承了抽象工厂Protocol,我们在实现具体方法时,必须要实现post、get,否则报错!
class HttpProtocol(Protocol):
    def __init__(self, ip):
        self._ip = ip
        
    def post(self,body):
    	http.request('POST', url, body=json.dumps(body))
	
	def get(self):
		http.get('get', url)
 #websocket协议 
 #继承了抽象工厂Protocol,我们在实现具体方法时,必须要实现post、get,否则报错!
class WebSocketProtocol(Protocol):
    def __init__(self, ip):
        self._ip = ip
        
    def post(self, body):
        if 'requestUrl' not in body:
            print('requestUrl is needed for WebSocket request')
            return False
        with self._ws_mutex:
             self._requests.append(json.dumps(body))
             print('已经发送: {}'.format(json.dumps(body)))
        return self.get_data()
      
     def get(self):
        data = self.sock.recv(4090)
        return data
	        
	      
 #tcp协议 
 #继承了抽象工厂Protocol,我们在实现具体方法时,必须要实现post、get,否则报错!
class TcpProtocol(Protocol):
	def __init__(self, ip):
        self._ip = ip
    def post(self, body):
        try:
            time.sleep(5)
            self.sock.send(body)
            print('已经发送: {}'.format(body))
        finally:
            pass

    def get(self):   '
        data = self.sock.recv(4090)
        return data
    
 

到此具体工厂已经实现了,我们可以使用HttpProtocol(ip).post(body)等去调用post、get方法了,调用时,根据具体的协议选择具体工厂,如果你需要用websocket协议进行收发,请用WebSocketProtocol(ip).post(body)。灵活使用。为了更加贴近实际的使用场景,我们对客户端代码,也使用工厂模式进行设计一下,看到这里我想我不用写,你也会设计了吧。不过为了照顾到大多数人,我还是写一下示例。

客户端针对不同的ip进行连接

#客户端抽象工厂
class TransportationFactory(metaclass=ABCMeta):
    '''传输层连接到ip'''
    #这里定义connect方法,以便符合实际场景
    @abstractmethod
    def connect(self,ip):
        '''连接到ip'''
        pass
#客户端具体工厂
class HttpTransportation(TransportationFactory):

    def connect(self,ip):
        return HttpProtocol(ip)

class WebSocketTransportation(TransportationFactory):
    def connect(self,ip):
        return WebSocketProtocol(ip)

class TcpTransportation(TransportationFactory):

    def connect(self,ip):
        return TcpProtocol(ip)
#具体使用方式
t_http = HttpTransportation().connect("192.168.1.10")
t_websocket = WebSocketTransportation().connect("192.168.1.10")
t_tcp = TcpTransportation.().connect("192.168.1.10")
body ={
  "services" : [ {
    "service_id" : "serviceId",
    "properties" : {
      "Height" : 124,
      "Speed" : 23.24
    },
    "event_time" : "2021-08-13T10:10:10.555Z"
  } ]
}
t_http.post(body)
t_websocket.post(body)
t_tcp.post(body)

标签:body,get,python,ip,代码,工厂,post,self
From: https://www.cnblogs.com/hengchen/p/18347502

相关文章

  • python-深拷贝和浅拷贝
     浅拷贝list_name=["李琪",["周义杰","毛绍祺"]]data01=list_name[:]#触发浅拷贝:只复制第一层,共享深层数据data01[0]="琪琪"#修改第一层,数据2份,互不影响data01[1][0]="义杰"#修改深层,数据1份,数据互相影响print(list_name)print(data01) 深拷贝 作用:互不......
  • 【C++】一文带你学完 C++【完整版-附代码示例】
    本文篇幅较长,几乎涵盖了权威C语言教程【CppPrimerPlus】的所有可用知识点,建议点赞收藏关注方便后续阅读。附注:建议学完一个知识点后,同步进行编程练习以便于巩固掌握知识点;编程学习是重理论更重实践的一个过程,唯有多写多练才能快速掌握C++全教程正文开始......
  • 大学之前没接触过代码?别慌,接下这泼天的安利吧
    编程小白如何成为大神?老学长亲身安利随着科技产品不断渗透各行各业,编程已成了所有专业的通识课,哪怕是学医,学法,甚至是学语言,看似毫无关联的背后,编程语言都发挥着各自的作用。类似的重要性网上一大堆,笔者不是营销号就不再赘述。但面对网上众多编程语言和学习资源,新生们,哪怕是过......
  • Python 循环引用与内存泄漏:深度解析
    Python循环引用与内存泄漏:深度解析在Python编程中,循环引用和内存泄漏是两个需要特别注意的问题。本文将深入探讨Python中的循环引用现象、其导致的内存泄漏问题,并提供详细的解决思路与方法。同时,我们还将分析一些常见场景,并分享扩展与高级技巧,帮助读者全面理解和应对这一......
  • GitHub点赞飙升!电信大牛的Python渗透测试实战指南
    在网络安全领域,会不会编程,是区分“脚本小子”和真正黑客的关键。实际的渗透测试中会遇到各种复杂的网络环境,常用工具不一定能满足需求,这时就需要对现有工具进行扩展,或者编写符合要求的工具、自动化脚本,这都需要一定的编程能力。在分秒必争的CTF竞赛中,想要高效地使用自制脚本......
  • 腾讯云AI代码助手评测:如何智能高效完成Go语言Web项目开发
    腾讯云AI代码助手评测:如何智能高效完成Go语言Web项目开发......
  • Python scipy.optimize 给出错误答案,如何处理半定正条件?
    目标是使用pythonscipy.optimize计算优化问题。假设C是给定的4维矩阵(在代码中我使用随机矩阵来表示)。优化后的变量为A0和B0,它们是二维对称矩阵。约束条件是I+A0、I-A0、I+B0、I-B0是半定正的,其中I是二维单位矩阵。目标函数为maxTr((A0⊗B0)C),其中⊗是克罗内克......
  • python+flask计算机毕业设计智慧养老系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着社会的快速发展和人口老龄化的加剧,智慧养老成为了社会关注的焦点。传统的养老模式已难以满足老年人日益增长的多元化需求,而智慧养老系......
  • 由于分页,无法使用 python al beautifulsoup 在 tripadvisor 中获取所有结果
    我正在尝试获取餐厅的链接,但我只能获取前30家餐厅的链接,而无法获取所有其他餐厅的链接。马德里地区的餐馆有数百家,分页每页只显示30家,以下代码只获取这30家importreimportrequestsfromopenpyxlimportWorkbookfrombs4importBeautifulSoupasbcity_name='......
  • 改进删除文件和目录的 python 脚本运行时间
    我有一个Python脚本,可以删除X天之前的文件和目录。然而,该脚本运行在一个包含数百万个文件和目录的巨大目录上。按照目前的速度,完成删除过程大约需要六周时间(查看磁盘空间指标)。看来主要瓶颈在于列出文件和目录。任何人都可以建议代码更改或优化,以帮助减少运行时间?不......