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

更新于:2023年7月6日

浏览量:116

开启您的职业生涯

完成课程获得认证

开始学习
广告