У меня есть библиотека UI-компонентов, причем некоторые компоненты могут создавать формы. Проблема в том, что логика, по которой создаются объекты этих форм, специфична для каждого приложения и не может быть помещена в общую библиотеку.
Я пока вижу такое решение, чтобы на уровне библиотеки создать статический класс-обертку, а приложение, при запуске, должно будет создать и поместить в этот статический класс объект, который содержит непосредственную логику создания форм.
Таким образом, из любого библиотечного компонента я смогу обратиться к этому статическому классу, чтобы создать форму, но, естественно, буду получать ошибку (или дефолтную форму), если разработчик приложения не позаботился о том, чтобы создать "конвеер" для этой фабрики.
Вот абстрактный пример:
internal class Program
{
static void Main()
{
IEngine engine = new Engine("Beep!");
Factory.SetEngine(engine);
Factory.DoWork();
}
/// Всю полезную работу выполняет этот класс, который должен быть создан
/// на уровне приложения и помещен в статический класс библиотеки
private sealed class Engine : IEngine
{
string _signal;
internal Engine(string signal)
{
_signal = signal;
}
public void DoWork()
{
Console.Write(_signal);
}
}
}
// Lib classes
public interface IEngine
{
void DoWork();
}
public static class Factory
{
static IEngine _engine;
public static void SetEngine(IEngine engine)
{
if (_engine != null)
throw new Exception("The engine has been already setted");
_engine = engine;
}
public static void DoWork()
{
if (_engine == null)
throw new Exception("The Factory haven't engine to do this");
_engine.DoWork();
}
}
Есть ли у такого паттерна устоявшееся название и какие у него могут быть альтернативы?