Mô hình nhà máy trừu tượng bằng Python

Aug 17 2020

Hôm nay tôi đã đọc về Mô hình Nhà máy Trừu tượng và đã cố gắng thực hiện các bước triển khai sau đây.

Tôi đã thấy rất nhiều triển khai trên internet, nơi họ sử dụng các switchcâu lệnh, nhưng tôi phải nói rằng tôi không thích điều đó lắm, vì bạn càng sản xuất nhiều nhà máy, đối với tôi dường như rất khó để thêm sản phẩm mới, Nếu cần thiết.

Dù sao, tôi đã hy vọng bạn hãy xem nó và cho tôi biết ý kiến ​​của bạn. Cảm ơn trước vì đã dành thời gian của bạn để xem xét nó.

Nhà máy

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()

Các cầu thủ bóng đá

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)

Những người chơi khúc côn cầu ( sự sáng tạo của tôi dừng lại ở đây, vì vậy tôi không bao gồm bất kỳ sự khác biệt nào giữa thủ môn và hậu vệ )

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


class HockeyGoalkeeper(HockeyPlayer):
    pass


class HockeyDefender(HockeyPlayer):
    pass

Trả lời

2 AJNeufeld Aug 17 2020 at 22:24

Vì mã của bạn hiện tại là viết tắt, bạn không cần các lớp Factory dẫn xuất. Chúng không làm gì khác biệt với nhau, vì vậy tất cả chúng đều có thể được xử lý bởi một lớp cơ sở cụ thể.

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),
}

Cách sử dụng ví dụ:

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

Nếu có một số khía cạnh của các nhà máy thực sự làm điều gì đó khác biệt, và do đó yêu cầu các lớp dẫn xuất riêng biệt, bạn sẽ cần đưa điều đó vào câu hỏi của mình.