Python'da Soyut Fabrika Modeli

Aug 17 2020

Bugün Soyut Fabrika Kalıbı hakkında bir şeyler okudum ve aşağıdaki uygulamayı yapmaya çalıştım.

İnternette switchdeyim kullandıkları bir çok uygulama gördüm ama söylemeliyim ki o kadar da hoşuma gitmedi, ne kadar çok fabrika yaparsan yap yeni ürün eklemeyi çok zorlaştırıyor bana öyle geliyor, gerekirse.

Her neyse, ona bir göz atmanı ve düşüncelerini bana bildirmeni umuyordum. İncelemeye zaman ayırdığınız için şimdiden teşekkür ederiz.

Fabrikalar

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()

Futbolcular

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)

Hokey oyuncuları ( yaratıcılığım burada durdu, bu yüzden kaleciler ve savunanlar arasında herhangi bir fark eklemedim )

class HockeyPlayer:
    def play(self):
        print("I'm playing hockey!")


class HockeyGoalkeeper(HockeyPlayer):
    pass


class HockeyDefender(HockeyPlayer):
    pass

Yanıtlar

2 AJNeufeld Aug 17 2020 at 22:24

Kodunuz şu anda olduğu gibi, türetilmiş Factory sınıflarına ihtiyacınız yoktur. Birbirlerinden farklı bir şey yapmazlar, bu yüzden hepsi somut bir temel sınıfla ele alınabilir.

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),
}

Örnek Kullanım:

>>> player = player_factory["Hockey"].create_defender()
>>> type(player)
<class '__main__.HockeyDefender'>
>>> player.play()
I'm playing hockey!
>>>

Fabrikaların aslında farklı bir şey yapan ve bu nedenle ayrı türetilmiş sınıfları gerektiren bazı yönleri varsa, bunu sorunuza eklemeniz gerekir.