使用 Python 工厂方法设计模式访问 Web 资源
Python 的工厂方法设计模式是一种创建型模式,它在超类中提供创建对象的接口,但允许子类更改将要创建的对象的类型。它用于定义创建对象的通用接口,同时允许子类决定实例化哪个类。在本文中,我们将探讨如何使用工厂方法设计模式在 Python 中访问 Web 资源。
访问 Web 资源
Python 提供了多个用于访问 Web 资源的库,例如 HTTP 请求、urllib 和 Requests。这些库允许我们向服务器发送 HTTP 请求并接收响应。但是,选择合适的库可能会很困难,尤其是在处理具有多个依赖项的大型项目时。为了解决这个问题,我们可以使用工厂方法设计模式来创建一个访问 Web 资源的通用接口,并让子类决定使用哪个库。
让我们从为我们的工厂定义抽象类开始:
from abc import ABC, abstractmethod
class WebResourceFactory(ABC):
@abstractmethod
def get(self, url):
pass
@abstractmethod
def post(self, url, data):
pass
WebResourceFactory 类是一个抽象类,它定义了访问 Web 资源的接口。它有两个抽象方法:get() 和 post(),这些方法将由具体的子类实现。
接下来,让我们创建两个具体的子类,它们分别使用 Requests 和 urllib 库实现 WebResourceFactory 接口:
import urllib.request
import requests
class RequestsWebResourceFactory(WebResourceFactory):
def get(self, url):
return requests.get(url)
def post(self, url, data):
return requests.post(url, data)
class UrllibWebResourceFactory(WebResourceFactory):
def get(self, url):
response = urllib.request.urlopen(url)
return response.read()
def post(self, url, data):
data = data.encode('utf-8')
req = urllib.request.Request(url, data=data)
response = urllib.request.urlopen(req)
return response.read()
RequestsWebResourceFactory 和 UrllibWebResourceFactory 类是具体的子类,它们分别使用 Requests 和 urllib 库实现 WebResourceFactory 接口。
现在,我们可以使用 WebResourceFactory 接口统一访问 Web 资源,而无需担心底层库。在下面的代码中,我们访问 Google 首页的 Web 资源。
access_web_resource() 函数接受一个工厂对象和一个 URL,并使用工厂对象访问指定 URL 上的 Web 资源。我们可以使用 RequestsWebResourceFactory 或 UrllibWebResourceFactory 类创建一个工厂对象,具体取决于我们想要使用的库。
def access_web_resource(factory, url):
web_resource = factory.get(url)
print(web_resource)
factory = RequestsWebResourceFactory()
access_web_resource(factory, 'https://www.google.com')
factory = UrllibWebResourceFactory()
access_web_resource(factory, 'https://www.google.com')
完整的代码和访问 Google 首页的输出如下:
import urllib.request
import requests
from abc import ABC, abstractmethod
class WebResourceFactory(ABC):
@abstractmethod
def get(self, url):
pass
@abstractmethod
def post(self, url, data):
pass
class RequestsWebResourceFactory(WebResourceFactory):
def get(self, url):
return requests.get(url)
def post(self, url, data):
return requests.post(url, data)
class UrllibWebResourceFactory(WebResourceFactory):
def get(self, url):
response = urllib.request.urlopen(url)
return response.read()
def post(self, url, data):
data = data.encode('utf-8')
req = urllib.request.Request(url, data=data)
response = urllib.request.urlopen(req)
return response.read()
def access_web_resource(factory, url):
web_resource = factory.get(url)
print(web_resource)
factory = RequestsWebResourceFactory()
access_web_resource(factory, 'https://www.google.com')
factory = UrllibWebResourceFactory()
access_web_resource(factory, 'https://www.google.com')
输出
<Response [200]> b'<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="en-IN"><head><meta content="text/html; charset=UTF-8" http- equiv="Content-Type"><meta content="/images/branding/googleg/1x/googleg_standard_color_128dp.png" itemprop="image"><title>Google</title><script …
结论
在本文中,我们探讨了如何使用工厂方法设计模式在 Python 中使用 Requests 和 urllib 库创建一个访问 Web 资源的通用接口。但是,此模式可以应用于任何需要根据通用接口创建不同类型对象的场景。
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C 语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP