我今天一直在阅读有关抽象工厂模式的文章,并试图做以下实现。
我在互联网上看到了很多实现,他们使用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发布于 2020-08-17 15:24:43
按照您当前的代码,您不需要派生工厂类。它们之间没有什么不同,所以它们都可以由一个具体的基类来处理。
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!
>>>如果工厂的某些方面实际上做了一些不同的事情,因此需要分离派生类,那么您就需要将其包含在问题中。
https://codereview.stackexchange.com/questions/248015
复制相似问题