Правильный шаблон для настройки объектов, созданных Factory

У меня была эта проблема, щекочущая меня последние недели; моя текущая реализация работает, но мне любопытно узнать, есть ли «хороший способ» сделать это. Я новичок в разработке шаблонов, так что это может быть глупым вопросом.

Проще говоря, у вас есть:

  • Прототип объекта, предоставляющий интерфейс (назовем его абстрактным ядром);
  • Конкретные ядра, реализующие вышеуказанный интерфейс различными способами;
  • Бетонный завод ядра;
  • Еще один объект Foo, в котором хранится указатель на абстрактное ядро, возвращаемый Factory.

Моя проблема в этом; конкретные реализации ядер могут определять свой собственный набор параметров, которые отличаются от одного ядра к другому.
Foo использует ядра для некоторой обработки, но эта обработка в конечном итоге зависит от этих параметров, и я не знаю, как их правильно настроить.

Я не хочу переходить на абстрактную фабрику и настраивать бетонную фабрику перед сборкой, потому что мне это кажется неправильным; это не фабрика с параметрами, а ядро.

Но с другой стороны, даже если я установлю указатель ядра в Foo как public, я не смогу получить доступ к параметрам базового ядра, поскольку они не являются частью интерфейса прототипа … Я уверен, что другие люди имели это проблема раньше, может быть, есть простое решение, которое я не вижу. : S

Заранее спасибо!

ПРИМЕЧАНИЕ: в моей текущей реализации нет Фабрики ядра. Я поместил конкретный тип ядра в качестве шаблона Foo и установил ядро ​​в качестве открытого члена, что позволяет мне конфигурировать ядро ​​после объявления и перед началом обработки.

0

Решение

Если фрагмент кода знает, с каким конкретным типом ядра он работает, он должен иметь указатель на этот конкретный конкретный тип ядра. Если это не так, он не может получить доступ к своим конкретным параметрам (но, возможно, может получить доступ ко всем параметрам в общем виде, как предложено @Jaywalker).

Ваша текущая реализация, кажется, идет по первому пути, что совершенно нормально.

У меня очень ограниченная информация о вашем дизайне, но похоже, что у вас есть несколько конкретных типов ядра, отдельный компоновщик для каждого типа и отдельный конфигуратор для каждого типа. Упаковать всех сборщиков в Factory проблематично, поскольку нет простого и элегантного способа пересылки конкретных типов ядра в соответствующие конфигураторы (без таких вещей, как *_cast<> или двойная отправка). Есть как минимум два способа решить эту проблему, но у нас есть Фабрика:

  1. Связывайте каждого сборщика с соответствующим конфигуратором и упаковывайте все пакеты в фабрику, которая производит сконфигурированные ядра.
  2. Объедините каждое ядро ​​с его конфигуратором и создайте Фабрику, производящую эти пакеты (таким образом, ядро ​​может быть настроено любое количество раз в течение его жизненного цикла).
1

Другие решения

Все, что не является частью интерфейса прототипа, не будет доступно в Foo, как вы сказали. Использовать фабричный шаблон просто не имеет смысла, если Foo знает специфику каждой реализации ядра.

В некоторых ограниченных случаях добавление чего-то вроде следующих методов получения и установки в интерфейсе прототипа может сделать вашу работу:

virtual bool setParameter (const string &key, const string &value) = 0;
virtual string getParameter (const string &key) = 0;
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector