Абстрактный шаблон дизайна фабрики для сценария ThemeFactory - PullRequest
0 голосов
/ 15 марта 2019

Я нахожусь в процессе реализации шаблона Abstract Factory Design.Сценарий, который я рассмотрел, приведен ниже.

enter image description here.Авторы статьи и изображения взяты из https://medium.com/@hitherejoe/design-patterns-abstract-factory-39a22985bdbf. Я пытаюсь реализовать в Python, и я застрял и не могу двигаться вперед по следующей причине

Когда вы определяете ThemeFactory как интерфейс в Pythonто какие бы методы вы не определили в ThemeFacory, они должны быть реализованы в конкретных классах, таких как LightTheme и DarkTheme.

Но меня беспокоит, есть ли необходимость предоставлять реализацию метода createLightTheme в классе Concrete DarkTheme и наоборот.Нужно ли мне перепроектировать всю архитектуру?

 import abc

 class ThemeFactory(metaclass=abc.ABCMeta):

     @abc.abstractmethod
     def createdarktheme(self):
         pass

     @abc.abstractmethod
     def createlighttheme(self):
         pass


 class DarkTheme(ThemeFactory):

     def createdarktheme(self):
        print('Hello created dark theme')

     def createlighttheme(self):
        pass


if __name__== '__main__':

   dark = DarkTheme()
   dark.createdarktheme()

1 Ответ

1 голос
/ 15 марта 2019

Ответ Рэя правильный, в том смысле, что диаграмма, на которую вы ссылаетесь, неверна.

ThemeFactory должен создавать Темы, а DarkTheme и LightTheme должны быть реализациями Темы.

Код будет выглядеть примерно так:

from abc import ABC, abstractmethod

class ThemeFactory(object):
     def createdarktheme(self) -> Theme:
         return DarkTheme()

     def createlighttheme(self) -> Theme:
         return LightTheme()

class Theme(ABC):
   @abstractmethod
   createToolbar() -> ToolBar:
       pass

   @abstractmethod
   createDialog() -> Dialog:
       pass

class DarkTheme(Theme):
   createToolbar() -> ToolBar:
       return DarkToolbar()

   createDialog() -> Dialog:
       return DarkDialog()


if __name__== '__main__':

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