Назад к вопросам
Middle
103
questionbank

Расскажите о паттерне, который вы использовали в своем коде или продукте?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Работал с паттерном "Фабрика", в частности, при реализации сервиса для обработки различных типов входящих запросов.

// Интерфейс для обработчиков запросов
type RequestHandler interface {
	Handle(requestData string) (string, error)
}

// Конкретный обработчик типа A
type TypeAHandler struct{}

func (h *TypeAHandler) Handle(requestData string) (string, error) {
	// Логика обработки для типа A
	return "Processed Type A: " + requestData, nil
}

// Конкретный обработчик типа B
type TypeBHandler struct{}

func (h *TypeBHandler) Handle(requestData string) (string, error) {
	// Логика обработки для типа B
	return "Processed Type B: " + requestData, nil
}

// Фабрика для создания обработчиков
func CreateHandler(requestType string) (RequestHandler, error) {
	switch requestType {
	case "type_a":
		return &TypeAHandler{}, nil
	case "type_b":
		return &TypeBHandler{}, nil
	default:
		return nil, fmt.Errorf("unknown request type: %s", requestType)
	}
}

// Пример использования
func main() {
	handlerA, err := CreateHandler("type_a")
	if err != nil {
		log.Fatal(err)
	}
	resultA, _ := handlerA.Handle("some data for A")
	fmt.Println(resultA)

	handlerB, err := CreateHandler("type_b")
	if err != nil {
		log.Fatal(err)
	}
	resultB, _ := handlerB.Handle("some data for B")
	fmt.Println(resultB)
}

Паттерн "Фабрика" позволил инкапсулировать логику создания объектов в отдельный класс (функцию), что упростило управление зависимостями и добавило гибкости. При необходимости добавить новый тип запроса, достаточно реализовать новый RequestHandler и добавить его в фабрику, не затрагивая код, который использует обработчики.