รูปแบบโรงงานนามธรรมใน Python

Aug 17 2020

วันนี้ฉันได้อ่านเกี่ยวกับรูปแบบโรงงานนามธรรมและพยายามดำเนินการต่อไปนี้

ฉันเคยเห็นการใช้งานมากมายในอินเทอร์เน็ตซึ่งพวกเขาใช้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!
>>>

หากมีลักษณะบางอย่างของโรงงานที่ทำสิ่งที่แตกต่างออกไปและทำให้จำเป็นต้องมีคลาสที่แยกจากกันคุณจะต้องรวมสิ่งนั้นไว้ในคำถามของคุณ