Builder | Padrões de Projeto | Python
- Builder | Padrões de Projeto | Python
Exemplo
- Classe que faz toda a construção sem usar o builder
class HTTPRequest:
"""The product - what we're building"""
def __init__(self, url):
self.url = url
self.method = "GET"
self.headers = {}
self.body = None
self.timeout = 30
self.auth = None
self.verify_ssl = True
self.allow_redirects = True
self.max_redirects = 5
self.cookies = {}
self.proxies = {}
def execute(self):
"""Simulate executing the request"""
auth_str = f" (auth: {self.auth[0]})" if self.auth else ""
return f"{self.method} {self.url}{auth_str} - timeout: {self.timeout}s"
- Refatorando
class HTTPRequestBuilder:
"""The builder - constructs HTTPRequest step by step"""
def __init__(self, url):
self._request = HTTPRequest(url)
def method(self, method):
"""Set HTTP method (GET, POST, etc.)"""
self._request.method = method.upper()
return self # Return self for method chaining
def header(self, key, value):
"""Add a header"""
self._request.headers[key] = value
return self
def headers(self, headers_dict):
"""Add multiple headers at once"""
self._request.headers.update(headers_dict)
return self
def body(self, body):
"""Set request body"""
self._request.body = body
return self
def timeout(self, seconds):
"""Set timeout in seconds"""
self._request.timeout = seconds
return self
def auth(self, username, password):
"""Set basic authentication"""
self._request.auth = (username, password)
return self
def disable_ssl_verification(self):
"""Disable SSL certificate verification"""
self._request.verify_ssl = False
return self
def disable_redirects(self):
"""Disable automatic redirects"""
self._request.allow_redirects = False
self._request.max_redirects = 0
return self
def build(self):
"""Return the constructed request"""
return self._request
# Now using the builder is much cleaner and more readable
request = (HTTPRequestBuilder("https://api.example.com/users")
.method("POST")
.header("Content-Type", "application/json")
.header("Accept", "application/json")
.body('{"name": "John", "email": "john@example.com"}')
.timeout(60)
.auth("username", "password")
.disable_redirects()
.build())
print(request.execute())
print(f"\nHeaders: {request.headers}")
print(f"SSL verification: {request.verify_ssl}")
print(f"Allow redirects: {request.allow_redirects}")
- Output
Headers: {'Content-Type': 'application/json', 'Accept': 'application/json'}
SSL verification: True
Allow redirects: False