Python кажется очень интересным языком, где все в вашей руке. Вы можете написать код, который работает или пишет красивый код с популярными и любимыми концепциями, такими как твердый, чистый код и шаблоны проектирования. Я не сделаю этот пост долго, и я постараюсь написать краткие концепции о Python от. В этом посте я расскажу о Фабрика шаблон , как мы можем реализовать, что в Python и как создавать Абстракция сделать все проще.
Допустим, у нас есть аудиоплеер, и мы можем играть в форматы WAV и MP3. Так основано на параметре волновать или mp3 Мы загружаем файлы и играем их. Давайте сначала сделаем интерфейс.
from abc import ABC, abstractmethod
class AudioPlayer(ABC):
@abstractmethod
def load(self, file: str) -> (str):
pass
@abstractmethod
def play(self) -> (str):
pass
Я использовал ABC Пакет для реализации формальной концепции интерфейса. @abstractmethod Декоратор подразумевает, что эти методы должны быть переопределены бетонными классами. Итак, давайте сделаем игроками сейчас.
class Mp3Player(AudioPlayer):
def __init__(self):
self.format = "mp3"
self.file = None
def load(self, file: str) -> (str):
self.file = file
return f"Loading {self.format} file named {file}"
def play(self) -> (str):
return f"playing {self.file}"
class WavPlayer(AudioPlayer):
def __init__(self):
self.format = "wav"
self.file = None
def load(self, file: str) -> (str):
self.file = file
return f"Loading {self.format} file named {file}"
def play(self) -> (str):
return f"playing {self.file}"
Так что у нас есть Мп3-плеер и Волшебник . Они реализуют оба метода нагрузка и Играть Отказ Эти два класса здесь идентичны, но в реализации реальной жизни нагрузка должна быть иной, может быть, игра. Теперь пришло время создать завод. Вот волшебство питона приходит в игру!
player_factory = {
'mp3': Mp3Player,
'wav': WavPlayer
}
Это потрясающе! Вы можете отобразить классы в словарях, так просто! На других языках вам, возможно, придется написать несколько случаев переключателя или если-else. Теперь вы можете напрямую использовать этот завод, чтобы вызвать нашу нагрузку и играть. Это называется Диспетчер в питоне.
mp3_player = player_factory['mp3']()
print(mp3_player.load("creep.mp3"))
print(mp3_player.play())
wav_player = player_factory['wav']()
print(wav_player.load("that's_life.wav"))
print(wav_player.play())
Посмотрите, как мы можем инициализировать класс на основе параметра! mp3_player ['mp3'] () – Это действительно круто. Так что весь код выглядит так –
from abc import ABC, abstractmethod
class AudioPlayer(ABC):
@abstractmethod
def load(self, file: str) -> (str):
raise NotImplementedError
@abstractmethod
def play(self) -> (str):
raise NotImplementedError
class Mp3Player(AudioPlayer):
def __init__(self):
self.format = "mp3"
self.file = None
def load(self, file: str) -> (str):
self.file = file
return f"Loading {self.format} file named {file}"
def play(self) -> (str):
return f"playing {self.file}"
class WavPlayer(AudioPlayer):
def __init__(self):
self.format = "wav"
self.file = None
def load(self, file: str) -> (str):
self.file = file
return f"Loading {self.format} file named {file}"
def play(self) -> (str):
return f"playing {self.file}"
player_factory = {
'mp3': Mp3Player,
'wav': WavPlayer
}
mp3_player = player_factory['mp3']()
print(mp3_player.load("creep.mp3"))
print(mp3_player.play())
wav_player = player_factory['wav']()
print(wav_player.load("that's_life.wav"))
print(wav_player.play())
Теперь вы можете спросить, что если пользователь дает MP4 в Player_Factory Инициализация, что произойдет. Хорошо, код будет сбой. Здесь мы можем сделать абстракцию и скрывать всю сложность создания класса, а также проверяя параметры.
class AudioPlayerFactory:
player_factory = {
'mp3': Mp3Player,
'wav': WavPlayer
}
@staticmethod
def make_player(format: str):
if format not in AudioPlayerFactory.player_factory:
raise Exception(f"{format} is not supported")
return AudioPlayerFactory.player_factory[format]()
Теперь мы можем просто использовать AudioPlayerFactory загрузить и играть.
mp3_player = AudioPlayerFactory.make_player('mp3')
print(mp3_player.load("creep.mp3"))
print(mp3_player.play())
wav_player = AudioPlayerFactory.make_player('wav')
print(wav_player.load("that's_life.wav"))
print(wav_player.play())
mp4_player = AudioPlayerFactory.make_player('mp4')
print(mp4_player.load("what_a_wonderful_life.mp4"))
print(mp4_player.play())
Вы увидите исключение для файла MP4. Вы можете справиться с этим по-своему. Так что новый код –
from abc import ABC, abstractmethod
class AudioPlayer(ABC):
@abstractmethod
def load(self, file: str) -> (str):
raise NotImplementedError
@abstractmethod
def play(self) -> (str):
raise NotImplementedError
class Mp3Player(AudioPlayer):
def __init__(self):
self.format = "mp3"
self.file = None
def load(self, file: str) -> (str):
self.file = file
return f"Loading {self.format} file named {file}"
def play(self) -> (str):
return f"playing {self.file}"
class WavPlayer(AudioPlayer):
def __init__(self):
self.format = "wav"
self.file = None
def load(self, file: str) -> (str):
self.file = file
return f"Loading {self.format} file named {file}"
def play(self) -> (str):
return f"playing {self.file}"
class AudioPlayerFactory:
player_factory = {
'mp3': Mp3Player,
'wav': WavPlayer
}
@staticmethod
def make_player(format: str):
if format not in AudioPlayerFactory.player_factory:
raise Exception(f"{format} is not supported")
return AudioPlayerFactory.player_factory[format]()
mp3_player = AudioPlayerFactory.make_player('mp3')
print(mp3_player.load("creep.mp3"))
print(mp3_player.play())
wav_player = AudioPlayerFactory.make_player('wav')
print(wav_player.load("that's_life.wav"))
print(wav_player.play())
mp4_player = AudioPlayerFactory.make_player('mp4')
print(mp4_player.load("what_a_wonderful_life.mp4"))
print(mp4_player.play())
Надеюсь, это поможет вам разработать фабрики 😀
Оригинал: “https://dev.to/ananto30/factory-pattern-abstraction-in-python-169g”