Pola Pabrik Abstrak dengan Python

Aug 17 2020

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 switchpernyataan, 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

2 AJNeufeld Aug 17 2020 at 22:24

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.