파이썬의 추상 팩토리 패턴

Aug 17 2020

나는 오늘 Abstract Factory Pattern에 대해 읽고 다음과 같은 구현을 시도했습니다.

나는 인터넷에서 switch문장 을 사용하는 많은 구현을 보았지만 그다지 좋아하지 않았다고 말해야합니다. 공장을 더 많이 만들수록 새로운 제품을 추가하는 것이 매우 어려워 보입니다. 필요한 경우.

어쨌든, 나는 당신이 그것을보고 당신의 의견을 알려주기를 바랍니다. 시간을내어 검토해 주셔서 미리 감사드립니다.

공장

from abc import ABC, abstractmethod


class PlayerFactory(ABC):
    """
    This class is meant to be an interface
    """
    @abstractmethod
    def create_goalkeeper(self):
        pass

    @abstractmethod
    def create_defender(self):
        pass


class FootballPlayerFactory(PlayerFactory):
    def create_goalkeeper(self):
        return FootballGoalkeeper()

    def create_defender(self):
        return FootballDefender()


class HockeyPlayerFactory(PlayerFactory):
    def create_goalkeeper(self):
        return HockeyGoalkeeper()

    def create_defender(self):
        return HockeyDefender()

축구 선수

class FootballPlayer:
    def __init__(self, uses_hands):
        self.uses_hands = uses_hands

    def play(self):
        print("I'm playing football!")


class FootballGoalkeeper(FootballPlayer):
    def __init__(self):
        super(FootballGoalkeeper, self).__init__(uses_hands=True)


class FootballDefender(FootballPlayer):
    def __init__(self):
        super(FootballDefender, self).__init__(uses_hands=False)

하키 선수 ( 내 창의력은 여기서 멈 췄기 때문에 골키퍼와 수비수의 차이를 포함하지 않았습니다 )

class HockeyPlayer:
    def play(self):
        print("I'm playing hockey!")


class HockeyGoalkeeper(HockeyPlayer):
    pass


class HockeyDefender(HockeyPlayer):
    pass

답변

2 AJNeufeld Aug 17 2020 at 22:24

현재 코드가 존재하므로 파생 된 Factory 클래스가 필요하지 않습니다. 그들은 서로 다른 것을하지 않으므로 모두 구체적인 기본 클래스에 의해 처리 될 수 있습니다.

class PlayerFactory:

    def __init__(self, goal_keeper_class, defender_class):
        self._goal_keeper_class = goal_keeper_class
        self._defender_class = defender_class

    def create_goalkeeper(self):
        return self._goal_keeper_class()

    def create_defender(self):
        return self._defender_class()

player_factory = {
    "Football": PlayerFactory(FootballGoalkeeper, FootballDefender),
    "Hockey": PlayerFactory(HockeyGoalkeeper, HockeyDefender),
}

사용 예 :

>>> player = player_factory["Hockey"].create_defender()
>>> type(player)
<class '__main__.HockeyDefender'>
>>> player.play()
I'm playing hockey!
>>>

실제로 다른 작업을 수행하여 분리 된 파생 클래스가 필요한 공장의 일부 측면이있는 경우 질문에이를 포함해야합니다.