अजगर में सार फैक्टरी पैटर्न
मैं आज सार फैक्ट्री पैटर्न के बारे में पढ़ रहा हूं, और निम्नलिखित कार्यान्वयन को बनाने की कोशिश की।
मैंने इंटरनेट में बहुत सारे कार्यान्वयन देखे हैं, जहां वे 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
जवाब
जैसा कि आपका कोड वर्तमान में खड़ा है, आपको व्युत्पन्न फैक्टरी कक्षाओं की आवश्यकता नहीं है। वे एक दूसरे से अलग कुछ भी नहीं करते हैं, इसलिए वे सभी एक ठोस आधार वर्ग द्वारा नियंत्रित किए जा सकते हैं।
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!
>>>
यदि कारखानों के कुछ पहलू हैं जो वास्तव में कुछ अलग करते हैं, और इस प्रकार अलग-अलग व्युत्पन्न वर्गों की आवश्यकता होती है, तो आपको इसे अपने प्रश्न में शामिल करना होगा।