使用 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 资源的通用接口。但是,此模式可以应用于任何需要根据通用接口创建不同类型对象的场景。