파이썬의 추상 팩토리 패턴
나는 오늘 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
현재 코드가 존재하므로 파생 된 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!
>>>
실제로 다른 작업을 수행하여 분리 된 파생 클래스가 필요한 공장의 일부 측면이있는 경우 질문에이를 포함해야합니다.