Почему шаблон Borg лучше, чем Шаблон "одиночка" в Python

Можно снять флажок с опцией сборки для указанных проектов в Вашем Конфигурация решения :

SolutionProperties
(источник: microsoft.com )

Вы банка может создать Ваши собственные конфигурации решения для создания определенных конфигураций проекта...

build config
(источник: microsoft.com )

74
задан Community 23 May 2017 в 12:09
поделиться

4 ответа

Настоящая причина того, что borg является различие сводится к созданию подклассов.

Если вы подклассифицируете borg, объекты подкласса имеют то же состояние, что и объекты их родительских классов, если вы явно не переопределите общее состояние в этом подклассе. Каждый подкласс одноэлементного шаблона имеет собственное состояние и поэтому будет создавать разные объекты.

Также в одноэлементном шаблоне объекты фактически одинаковы, а не только состояние (хотя состояние - единственное, что действительно имеет значение).

57
ответ дан 24 November 2019 в 12:02
поделиться

Это не является. Что обычно не рекомендуется, так это такой шаблон в python:

class Singleton(object):

 _instance = None

 def __init__(self, ...):
  ...

 @classmethod
 def instance(cls):
  if cls._instance is None:
   cls._instance = cls(...)
  return cls._instance

, где вы используете метод класса для получения экземпляра вместо конструктора. Метапрограммирование Python позволяет использовать гораздо лучшие методы, например, тот, что в Википедии :

class Singleton(type):
    def __init__(cls, name, bases, dict):
        super(Singleton, cls).__init__(name, bases, dict)
        cls.instance = None

    def __call__(cls, *args, **kw):
        if cls.instance is None:
            cls.instance = super(Singleton, cls).__call__(*args, **kw)

        return cls.instance

class MyClass(object):
    __metaclass__ = Singleton

print MyClass()
print MyClass()
13
ответ дан 24 November 2019 в 12:02
поделиться

Класс в основном описывает, как вы можете получить доступ (чтение / запись) к внутреннему состоянию вашего объект.

В шаблоне singleton у вас может быть только один класс, то есть все ваши объекты будут давать вам одинаковые точки доступа к общему состоянию. Это означает, что если вам нужно предоставить расширенный API, вам нужно будет написать оболочку, обернутую вокруг singleton

. В шаблоне borg вы можете расширить базовый класс «borg» и тем самым более удобно расширить API. на ваш вкус.

8
ответ дан 24 November 2019 в 12:02
поделиться

Это лучше только в тех немногих случаях, когда у вас действительно есть разница. Например, когда вы создаете подкласс. Паттерн Борг чрезвычайно необычен, мне он ни разу не понадобился по-настоящему за десять лет программирования на Python.

8
ответ дан 24 November 2019 в 12:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: