Пример, который вы привели, не является абстрактной фабрикой. Абстрактные фабрики имеют фабричные методы (то есть методы, которые создают и возвращают объекты).
Что касается принципа «открыто / закрыто», то абстрактная фабричная модель по своей природе облегчает это. Код «закрыт» в том смысле, что его не нужно изменять, если вы добавляете новую фабрику (потому что вы используете внедрение зависимостей), и он «открыт» в том смысле, что вы можете расширить функциональность, написав новую абстрактную фабрику .
ОБНОВЛЕНИЕ: Вот пример кода в вопросе, измененном для отображения абстрактной фабрики:
public interface IForm
{
void ShowFormName();
}
public interface IAbstractFormFactory
{
IForm MakeForm();
}
public class VistaForm : IForm
{
public void ShowFormName()
{
Console.WriteLine("Vista Form");
}
}
public class VistaFormFactory : IAbstractFormFactory
{
public IForm MakeForm()
{
return new VistaForm();
}
}
public class WinXpForm : IForm
{
public void ShowFormName()
{
Console.WriteLine("WinXP Form");
}
}
public class WinXpFormFactory : IAbstractFormFactory
{
public IForm MakeForm()
{
return new WinXpForm();
}
}
public static class Application
{
public static void Run(IAbstractFormFactory factory)
{
IForm form = factory.MakeForm();
form.ShowFormName();
}
}
public class Program
{
public static void Main()
{
IAbstractFormFactory factory;
int sys = 0;
if (sys == 0)
{
factory = new WinXpFormFactory();
}
else
{
factory = new VistaFormFactory();
}
Application.Run(factory);
Console.ReadLine();
}
}