รูปแบบโรงงานนามธรรมใน Python
วันนี้ฉันได้อ่านเกี่ยวกับรูปแบบโรงงานนามธรรมและพยายามดำเนินการต่อไปนี้
ฉันเคยเห็นการใช้งานมากมายในอินเทอร์เน็ตซึ่งพวกเขาใช้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
คำตอบ
เนื่องจากโค้ดของคุณมีอยู่ในปัจจุบันคุณไม่จำเป็นต้องมีคลาส 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!
>>>
หากมีลักษณะบางอย่างของโรงงานที่ทำสิ่งที่แตกต่างออกไปและทำให้จำเป็นต้องมีคลาสที่แยกจากกันคุณจะต้องรวมสิ่งนั้นไว้ในคำถามของคุณ