Pola Pabrik Abstrak dengan Python
Saya telah membaca hari ini tentang Pola Pabrik Abstrak, dan mencoba membuat implementasi berikut.
Saya telah melihat banyak penerapan di internet, di mana mereka menggunakan switch
pernyataan, tetapi saya harus mengatakan bahwa saya tidak terlalu suka, karena semakin banyak pabrik yang Anda buat, bagi saya tampaknya sangat sulit untuk menambahkan produk baru, jika diperlukan.
Bagaimanapun, saya berharap Anda untuk melihatnya dan memberi tahu saya pendapat Anda. Terima kasih sebelumnya telah meluangkan waktu Anda untuk meninjaunya.
Pabrik
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()
Pemain sepakbola
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)
Pemain hoki ( kreativitas saya berhenti di sini, jadi saya tidak memasukkan perbedaan apa pun antara penjaga gawang dan bek )
class HockeyPlayer:
def play(self):
print("I'm playing hockey!")
class HockeyGoalkeeper(HockeyPlayer):
pass
class HockeyDefender(HockeyPlayer):
pass
Jawaban
Sebagai kode Anda saat ini, Anda tidak memerlukan kelas Pabrik turunan. Mereka tidak melakukan sesuatu yang berbeda satu sama lain, sehingga semuanya dapat ditangani oleh kelas dasar beton.
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),
}
Contoh Penggunaan:
>>> player = player_factory["Hockey"].create_defender()
>>> type(player)
<class '__main__.HockeyDefender'>
>>> player.play()
I'm playing hockey!
>>>
Jika ada beberapa aspek dari pabrik yang benar-benar melakukan sesuatu yang berbeda, dan karenanya memerlukan kelas turunan yang terpisah, Anda perlu memasukkannya ke dalam pertanyaan Anda.