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