По умолчанию конструкторы должны быть предпочтительнее, потому что их проще понять и написать. Однако, если вам нужно отделить конструктивные тонкости объекта от его смыслового значения, понимаемого кодом клиента, вам будет лучше использовать фабрики.
Разница между конструкторами и фабриками аналогична , скажем, переменную и указатель на переменную. Существует еще один уровень косвенности, что является недостатком; но есть еще один уровень гибкости, что является преимуществом. Поэтому, делая выбор, вам было бы полезно провести анализ затрат и выгод.
Так как я не знаю, как Ваш метод фабрики похож, все, чему я могу советовать, прямо сейчас к
Проверка, чтобы видеть, что объект является корректной конкретной реализацией, которую Вы искали:
IMyInterface fromFactory = factory.create(...);
Assert.assertTrue(fromFactory instanceof MyInterfaceImpl1);
можно проверить если установка фабрики конкретные экземпляры с допустимыми переменными экземпляра.
@cem-catikkas я думаю, что это было бы более корректно для сравнения getClass () .getName () значения. В случае, что класс MyInterfaceImpl1 разделяется на подклассы, мог быть поврежден Ваш тест, поскольку подкласс является instanceof MyInterfaceImpl1. Я переписал бы следующим образом:
IMyInterface fromFactory = factory.create(...);
Assert.assertEquals(fromFactory.getClass().getName(), MyInterfaceImpl1.class.getName());
, Если Вы думаете, что это могло бы перестать работать в некотором роде (я не могу вообразить), сделайте эти две проверки.
if (myNewObject instanceof CorrectClass)
{
/* pass test */
}
обновление:
не знают, почему это было отмечено, таким образом, я разверну его немного...
public void doTest()
{
MyInterface inst = MyFactory.createAppropriateObject();
if (! inst instanceof ExpectedConcreteClass)
{
/* FAIL */
}
}