То, что вы перечислите здесь, называется простой фабрикой. Первый лучше, потому что создание в основном определяется параметром, а не методом.
На самом деле шаблон фабричного метода является официальным, скажем, есть IFoo,и есть две реализации FooA, FooB следующим образом:
public interface IFoo
{
}
public class FooA : IFoo
{
}
public class FooB : IFoo
{
}
Тогда возникает проблема при использовании IFoo в клиентском приложении - Как создать экземпляр реализации?Связь существует, потому что клиент зависит от создания FooA / FooB, даже FooC в функции, поэтому нам нужно разъединение.Мы переносим ответственность за создание экземпляра реализации IFoo на другой интерфейс:
public interface IFooFactory
{
IFoo CreateFoo();
}
, чтобы создать FooA, нам нужно:
public class FooAFactory : IFooFactory
{
public IFoo CreateFoo()
{
return new FooA();
}
}
, чтобы создать FooB, нам нужно:
public class FooBFactory : IFooFactory
{
public IFoo CreateFoo()
{
return new FooB();
}
}
Эффект здесь заключается в том, что при наличии FooC нам не нужно изменять существующую Factory, нам просто нужно реализовать другую FooCFactory.