У меня много (абстрактных) фабрик, и они обычно реализуются как одиночные.
Обычно для удобства, чтобы не проходить их через слои, которые действительно не имеют дела с использованием или знанием этих фабрик.
В большинстве случаев мне нужно только принять решение при запуске, какая фабрика реализует остальную часть программы кода, возможно, через некоторую конфигурацию
это выглядит например как
abstract class ColumnCalculationFactory {
private static ColumnCalculationFactory factory;
public static void SetFactory(ColumnCalculationFactory f) {
factory = f;
}
public static void Factory() {
return factory;
}
public IPercentCalculation CreatePercentCalculation();
public IAverageCalculation CreateAverageCalculation();
....
}
Что-то действительно пахнет этим, я просто не уверен, что - это, может быть, больше неуловимый глобальный, чем синглтон. Не похоже, что на самом деле должна быть только одна фабрика, когда-либо создававшая ColumnCalculations - хотя моим программам и не нужно больше.
Считается ли это лучшей практикой? Должен ли я лучше поместить их в какой-нибудь (полу) глобальный класс AppContext? Что-то еще (я еще не совсем готов переключиться на какой-то более крупный контейнер IoC или spring.net, кстати)?