Python 使用Factory Method设计模式访问Web资源
Python的Factory Method设计模式是一个创建模式,它在超类中提供了一个创建对象的接口,但允许子类来改变将要创建的对象的类型。它用于定义一个通用的接口来创建对象,同时允许子类决定要实例化的类。在本文中,我们将探讨如何使用Factory Method设计模式来在Python中访问Web资源。
访问Web资源
Python提供了几个用于访问Web资源的库,如HTTP请求、urllib和Requests。这些库允许我们向服务器发送HTTP请求并接收响应。然而,选择正确的库可能是困难的,特别是在处理具有多个依赖项的大型项目时。为了解决这个问题,我们可以使用Factory Method设计模式来创建一个通用的接口,用于访问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接口统一访问网络资源,而不必担心底层库。在下面的代码中,我们正在访问Google主页的网络资源。
access_web_resource()函数接受一个工厂对象和一个URL,并使用工厂对象访问指定URL的网络资源。我们可以使用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库来创建一个用于访问网络资源的通用接口。然而,这个模式可以应用于任何需要根据通用接口创建不同类型对象的场景。