У мене є заводський клас і інтерфейс, який викликає цекласу, але цей клас може бути спочатку інстанційно створений з декількох місць в інтерфейсі користувача, тому я зберігав factoryObject у класі UI і для кожної функції, яка може створювати екземпляр класу, який я виконав
if not self.factoryObject:
self.factoryObject = MyFactoryClass()
Це хороша практика кодування або є кращий спосіб зробити це? Дякую.
Відповіді:
1 для відповіді № 1Чи потрібно мати кілька окремих екземплярів фабричного класу? Якщо ні, просто створіть глобальний синглтон і використовуйте його всюди:
factory = Factory()
В іншому випадку всі наведені нижче опції дозволяють писати код, наприклад:
ui = UI()
ui.factory.make_stuff()
щоб можна було легко перемикатися між цими методами, якщо потрібно.
Добре, вам потрібні окремі фабричні екземпляри. Але чи потрібен вам окремий екземпляр для кожного екземпляра класу інтерфейсу? Якщо ні:
class UI(object):
factory = Factory()
Добре, вам потрібен один завод для кожного інтерфейсу інтерфейсу. Чи дорого коштувати завод? Чи часто у вас є екземпляри інтерфейсу, які ніколи не використовують фабрику? Ви виміряли проблему продуктивності? Якщо відповідь на будь-який з них не відповідає, то, можливо, просто створіть завод, коли ви створюєте інтерфейс користувача:
class UI(object):
def __init__(self):
self.factory = Factory()
Нарешті, відповідь на ваше запитання, якщо ви дійсно хочете ліниво інстанціювати фабрику:
class UI(object):
def __init__(self):
self._factory = None
@property
def factory(self):
if self._factory is None:
self._factory = Factory()
return self._factory
The @property
декоратор дозволить вам писати ui.factory
.
Якщо ви виявите, що часто пишете цей тип шаблонів у своїх класах і втомилися від цього, розгляньте третю сторону cached_property пакет:
from cached_property import cached_property
class UI(object):
@cached_property
def factory(self):
return Factory()