Пример:
class Product:
def __init__(self, name):
self.name = name
def operation(self):
pass
class ConcreteProductA(Product):
def operation(self):
return "Product A operation"
class ConcreteProductB(Product):
def operation(self):
return "Product B operation"
class Creator:
def factory_method(self, type):
if type == "A":
return ConcreteProductA("Product A")
elif type == "B":
return ConcreteProductB("Product B")
else:
return None # or raise an exception
# Клиентский код
creator = Creator()
product_a = creator.factory_method("A")
print(product_a.operation()) # Output: Product A operation
product_b = creator.factory_method("B")
print(product_b.operation()) # Output: Product B operation
Пояснение: Creator
имеет метод factory_method
, который решает, какой конкретный продукт создать (ConcreteProductA
или ConcreteProductB
) на основе входного аргумента. Это позволяет клиенту запрашивать создание объекта, не зная конкретный класс, который будет создан.
Реализация паттерна "Фабрика" с использованием классов и объектов в Python позволяет создавать объекты без указания конкретного класса, который нужно инстанцировать. Это упрощает код и делает его более гибким, позволяя легко добавлять новые типы объектов.
Вот пример реализации:
class Animal:
def speak(self):
raise NotImplementedError("Subclass must implement abstract method")
class Dog(Animal):
def speak(self):
return "Woof!"
class Cat(Animal):
def speak(self):
return "Meow!"
class AnimalFactory:
def create_animal(self, animal_type):
if animal_type == "dog":
return Dog()
elif animal_type == "cat":
return Cat()
else:
raise ValueError("Unknown animal type")
# Пример использования:
factory = AnimalFactory()
dog = factory.create_animal("dog")
cat = factory.create_animal("cat")
print(dog.speak()) # Вывод: Woof!
print(cat.speak()) # Вывод: Meow!
# Обработка неизвестного типа:
try:
unknown_animal = factory.create_animal("parrot")
except ValueError as e:
print(e) # Вывод: Unknown animal type
Разберем код:
Animal
: Это абстрактный базовый класс, который определяет интерфейс для всех животных. Метод speak()
должен быть реализован в подклассах.Dog
и Cat
: Это конкретные классы животных, которые наследуются от Animal
и реализуют метод speak()
, возвращая соответствующий звук.AnimalFactory
: Это фабричный класс. Метод create_animal()
принимает тип животного в качестве аргумента и возвращает экземпляр соответствующего класса.Преимущества использования фабрики:
create_animal()
. Клиентский код при этом не нужно менять.Альтернативные реализации (с использованием словаря):
Для большей гибкости можно использовать словарь для хранения соответствий между типом животного и классом:
class AnimalFactory:
def __init__(self):
self._animal_types = {
"dog": Dog,
"cat": Cat
}
def create_animal(self, animal_type):
animal_class = self._animal_types.get(animal_type)
if animal_class:
return animal_class()
else:
raise ValueError("Unknown animal type")
# Пример использования остается прежним.
В этой реализации легче добавлять новые типы, просто добавляя запись в словарь _animal_types
.
Еще один пример, использующий абстрактный класс (ABC):
from abc import ABC, abstractmethod
class Animal(ABC):
@abstractmethod
def speak(self):
pass
class Dog(Animal):
def speak(self):
return "Woof!"
class Cat(Animal):
def speak(self):
return "Meow!"
class AnimalFactory:
def create_animal(self, animal_type):
if animal_type == "dog":
return Dog()
elif animal_type == "cat":
return Cat()
else:
raise ValueError("Unknown animal type")
В этом примере Animal
является абстрактным базовым классом, что явно указывает на его роль и предотвращает создание экземпляров Animal
напрямую.