अजगर में सार फैक्टरी पैटर्न

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

जैसा कि आपका कोड वर्तमान में खड़ा है, आपको व्युत्पन्न फैक्टरी कक्षाओं की आवश्यकता नहीं है। वे एक दूसरे से अलग कुछ भी नहीं करते हैं, इसलिए वे सभी एक ठोस आधार वर्ग द्वारा नियंत्रित किए जा सकते हैं।

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!
>>>

यदि कारखानों के कुछ पहलू हैं जो वास्तव में कुछ अलग करते हैं, और इस प्रकार अलग-अलग व्युत्पन्न वर्गों की आवश्यकता होती है, तो आपको इसे अपने प्रश्न में शामिल करना होगा।