Имеет ли смысл эта схема интерфейса, реализации, фабрики в Python ABC?
У меня есть приложение Django и очередь сообщений, и я хочу иметь возможность легко переключаться между службами очередей (SQS или RabbitMQ, например).
Итак, я установил BaseQueue
"интерфейс":
class BaseQueue(ABC):
@abstractmethod
def send_message(self, queue_name, message, message_attributes=None):
pass
И два конкретных класса, которые наследуются от BaseQueue
:
class SqsQueue(BaseQueue):
def send_message(self, queue_name, message, message_attributes=None):
# code to send message to SQS
class RabbitMqQueue(BaseQueue):
def send_message(self, queue_name, message, message_attributes=None):
# code to send message to RabbitMQ
Затем в settings.py
у меня есть значение, указывающее на реализацию, которую приложение должно использовать:
QUEUE_SERVICE_CLS = "queues.sqs_queue.SqsQueue"
Поскольку это приложение Django, оно находится в settings.py
, но это значение может быть откуда угодно. Оно просто говорит, где находится класс.
Тогда у меня есть QueueFactory
, задача которого - вернуть сервис очереди для использования:
class QueueFactory:
@staticmethod
def default():
return import_string(settings.QUEUE_SERVICE_CLS)()
Фабрика импортирует класс и инстанцирует его.
Я бы использовал его следующим образом:
QueueFactory.default().send_message(queue_name, message)
Это работает, но мне интересно, есть ли более Python способ сделать это? Например, с помощью каких-нибудь магических методов?