Ответ
Да, метод класса может возвращать как сам класс (объект типа type), так и экземпляр другого (или текущего) класса. Это ключевая концепция для реализации таких паттернов, как Фабричный метод или Строитель.
Возвращение экземпляра позволяет делегировать создание сложных объектов, а возвращение класса — предоставить вызывающему коду возможность самому создать экземпляр.
Пример (Python)
В этом примере ShapeFactory.create_shape в зависимости от аргумента возвращает экземпляр одного из подклассов Shape.
from abc import ABC, abstractmethod
# Абстрактный базовый класс
class Shape(ABC):
@abstractmethod
def draw(self):
pass
# Конкретные реализации
class Circle(Shape):
def draw(self):
print("Рисуем круг")
class Square(Shape):
def draw(self):
print("Рисуем квадрат")
# Фабричный метод
class ShapeFactory:
@staticmethod
def create_shape(shape_type: str) -> Shape:
"""Создает и возвращает экземпляр нужной фигуры."""
if shape_type == 'circle':
return Circle()
if shape_type == 'square':
return Square()
raise ValueError(f"Неизвестный тип фигуры: {shape_type}")
# Использование
circle_obj = ShapeFactory.create_shape('circle')
circle_obj.draw() # Вывод: Рисуем круг
Ключевые моменты:
- Гибкость: Позволяет системе легко добавлять новые типы продуктов (фигур), не изменяя код, который их создает.
- Инкапсуляция: Логика создания объектов скрыта внутри фабричного метода.