首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中的抽象工厂模式

Python中的抽象工厂模式
EN

Code Review用户
提问于 2020-08-17 00:56:38
回答 1查看 203关注 0票数 3

我今天一直在阅读有关抽象工厂模式的文章,并试图做以下实现。

我在互联网上看到了很多实现,他们使用switch语句,但我必须说,我不太喜欢它,因为你制造的工厂越多,在我看来,如果需要的话,增加新产品是非常困难的。

总之,我希望你能看一看,告诉我你的意见。提前感谢您花时间复习。

工厂

代码语言:javascript
复制
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()

足球运动员

代码语言:javascript
复制
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)

曲棍球运动员(我的创造力在这里停止了,所以我不包括守门员和后卫之间的任何区别)。

代码语言:javascript
复制
class HockeyPlayer:
    def play(self):
        print("I'm playing hockey!")


class HockeyGoalkeeper(HockeyPlayer):
    pass


class HockeyDefender(HockeyPlayer):
    pass
EN

回答 1

Code Review用户

回答已采纳

发布于 2020-08-17 15:24:43

按照您当前的代码,您不需要派生工厂类。它们之间没有什么不同,所以它们都可以由一个具体的基类来处理。

代码语言:javascript
复制
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),
}

示例用法:

代码语言:javascript
复制
>>> player = player_factory["Hockey"].create_defender()
>>> type(player)
<class '__main__.HockeyDefender'>
>>> player.play()
I'm playing hockey!
>>>

如果工厂的某些方面实际上做了一些不同的事情,因此需要分离派生类,那么您就需要将其包含在问题中。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/248015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档