Паттерн Борг или просто модуль с функциями - PullRequest
4 голосов
/ 22 ноября 2010

Я думал об использовании шаблона Singleton в своем проекте, поэтому я искал StackOverflow, чтобы найти питонский способ его реализации. Я нашел этот вопрос с принятым ответом, в котором говорилось, что " модуль с функциями (а не классом) хорошо бы послужил одиночным ". С другой стороны, во втором ответе было предложено использовать паттерн Борга . Для меня использование модуля - это простое и понятное решение, поэтому я хотел бы понять, когда использование Borg предпочтительнее.

Ответы [ 4 ]

3 голосов
/ 22 ноября 2010

Синглтон и модуль представляют только один экземпляр за все время существования приложения. Этот экземпляр сохраняется, даже когда он не нужен.

Шаблон borg касается общего состояния. Каждый клиентский класс создаст новый экземпляр borg, но этот экземпляр будет удален, когда он больше не нужен - это гораздо более элегантный подход.

Кроме того, гораздо проще создавать подклассы или издеваться над боргами.

3 голосов
/ 22 ноября 2010

Разница в том, что в паттерне Борг у вас будут разные объекты, атрибуты которых одинаковы, а при использовании версии модуля вы получаете один объект (модуль).

Также объект и модуль немного отличаются: вы не можете выбирать модули, но можете выбирать классы. Также вы можете выполнять операции над объектами (>, <, +, - и т. Д.) </p>

Чтобы быть немного не по теме: с некоторой модификацией шаблон Борга можно использовать как очень простой Multiton:

class Multiton(object):
    __shared_states = {}

    def __init__(self, name):
        if not self.__shared_states.has_key(name):
            self.__shared_states[name] = {}

        self.__dict__ = self.__shared_states[name]
1 голос
/ 10 марта 2011

У меня есть один случай использования, где светится шаблон Борга:

вы не можете определить функцию на уровне модуля как @property. Если вам нужны некоторые общие данные (например, config), возвращающие динамические свойства, вы можете получить их из Borg и затем написать методы свойств.

1 голос
/ 22 ноября 2010

Не могли бы вы вместо этого использовать статический класс? SO Вопрос

т.е.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...