Если вы используете .NET, вы можете построить его с отражением. Например, если вы создаете систему плагинов, у вас будет папка, в которую можно вставлять библиотеки плагинов. Затем ваша фабрика будет просматривать доступные библиотеки DLL, проверять каждую из них на наличие соответствующих атрибутов отражения, а затем сопоставлять эти атрибуты с любой строкой, которая была передана, чтобы решить, какой объект выбрать и вызвать.
Это избавляет вас от необходимости перекомпилировать основное приложение, хотя вам придется собирать своих работников в других библиотеках DLL, а затем иметь способ сообщить своей фабрике, какое из них использовать.
Вот несколько действительно быстрых и грязных псевдокодов, чтобы понять суть:
Предполагается, что у вас есть сборка DLL под названием Workers.DLL
Установите атрибут WorkerTypeAttribute со строковым свойством Name и конструктором, чтобы можно было установить это свойство Name.
[AttributeUsage(AttributeTargets.Class, AllowMultiple=false)]
public class WorkerTypeAttribute : Attribute
{
string _name;
public string Name { get { return _name; } }
public WorkerTypeAttribute(string Name)
{
_name = Name;
}
}
Затем вы примените этот атрибут к любому рабочему классу, который вы определили как:
[WorkerType("CogWorker")]
public class CogWorker : WorkerBase {}
Тогда на фабрике рабочих вашего приложения вы напишете код вроде:
public void WorkerFactory(string WorkerType)
{
Assembly workers = Assembly.LoadFile("Workers.dll");
foreach (Type wt in workers.GetTypes())
{
WorkerTypeAttribute[] was = (WorkerTypeAttribute[])wt.GetCustomAttributes(typeof(WorkerTypeAttribute), true);
if (was.Count() == 1)
{
if (was[0].Name == WorkerType)
{
// Invoke the worker and do whatever to it here.
}
}
}
}
Я уверен, что есть и другие примеры того, как это сделать, но если вам нужны дополнительные указатели, дайте мне знать. Главное, чтобы у всех ваших работников был общий родитель или интерфейс, чтобы вы могли вызывать их одинаково. (Т. Е. Всем вашим работникам нужен общий метод «Выполнить» или что-то, что может быть вызвано на заводе или везде, где вы используете объект.