Интерфейсы используются, когда возможно существование нескольких реализаций одного функционального набора. Это звучит так, как будто это относится к вашему конкретному сценарию.
С точки зрения ваших примеров, я бы определенно выбрал B, его легче поддерживать. Встраивает слишком много общей логики [т.е. определение платформы] в отдельные классы [и / или методы]. Если вы хотите создать свой собственный класс Factory, попробуйте обобщить его [с помощью общего метода Resolve<IType> ()
или чего-то еще], а не метода \ класса для интерфейса.
Например,
// i called it a "container" because it "contains" implementations
// or instantiation methods for requested types - but it *is* a
// factory.
public class Container
{
// "resolves" correct implementation for a requested type.
public IType Resolve<IType> ()
{
IType typed = default (IType);
if (isPlatformA)
{
// switch or function map on IType for correct
// platform A implementation
}
else if (isPlatformB)
{
// switch or function map on IType for correct
// platform B implementation
}
else
{
// throw NotSupportedException
}
return typed;
}
}
Однако вместо того, чтобы реализовывать собственный шаблон Factory, вы можете исследовать альтернативные реализации, такие как MS Unity2.0 или Castle Windsor CastleWindsorContainer . Их легко настроить и использовать.
В идеале
// use an interface to isolate *your* code from actual
// implementation, which could change depending on your needs,
// for instance if you "roll your own" or switch between Unity,
// Castle Windsor, or some other vendor
public interface IContainer
{
IType Resolve<IType> ();
}
// custom "roll your own" container, similar to above,
public class Container : IContainer { }
// delegates to an instance of a Unity container,
public class UnityContainer : IContainer { }
// delegates to an instance of a CastleWindsorContainer,
public class CastleWindsorContainer : IContainer { }
О, предположим, мне следует кричать Ninject и StructureMap . Я просто не так знаком с ними, как с Unity или CastleWindsor.