Does this Python ABC interface, implementations, factory pattern make sense?

Viewed 26

I've got a Django app and a message queue and I want to be able to switch between queue services easily (SQS or RabbitMQ for example).

So I set up a BaseQueue "interface":

class BaseQueue(ABC):
    @abstractmethod
    def send_message(self, queue_name, message, message_attributes=None):
        pass

And two concrete classes that inherit from 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

Then in settings.py I've got a value pointing to the implementation the app should use:

QUEUE_SERVICE_CLS = "queues.sqs_queue.SqsQueue"

Because it's a Django app it's in settings.py, but this value could be coming from anywhere. It just says where the class is.

Then I've got a QueueFactory whose job is to return the queue service to use:

class QueueFactory:
    @staticmethod
    def default():
        return import_string(settings.QUEUE_SERVICE_CLS)()

The factory imports the class and instantiates it.

I would then use it like so:

QueueFactory.default().send_message(queue_name, message)

It works, but I was wondering if there's a more Python way to do it? Like with some magic methods?

0 Answers
Related