Шаблон проектирования - абстрактный шаблон фабрики и открытый закрытый принцип

Я новичок в разработке шаблонов.

Я пытаюсь использовать Abstract Factory - шаблон, сохраняя принцип Open-Closed.

Пожалуйста, посмотрите на следующий код:

public interface IAbstractFormFactory
    {
        void ShowOSName();        
    }

public class VistaForm : IAbstractFormFactory
    {
        public void ShowOSName()
        {
            Console.WriteLine("Vista");
        }
    }

public class WinXpForm : IAbstractFormFactory
    {
        public void ShowOSName()
        {
            Console.WriteLine("Win XP");
        }
    }

public static class Application
    {
        public static void Run(IAbstractFormFactory factory)
        {
            factory.ShowOSName();
        }
    }

public class Program 
    {
        public static void Main() 
        {
            IAbstractFormFactory form;

            int sys = 0;

            if (sys == 0) 
            {
                form = new WinXpForm();
            } 
            else 
            {
                form = new VistaForm();
            }

            Application.Run(form);

            Console.ReadLine();
        }
    }

это может быть примером абстрактной фабричной модели?

Если да, то как я могу реорганизовать его, включив концепцию открытого закрытого принципа?

4 ответа

Решение

Приведенный вами пример не является абстрактной фабрикой. Абстрактные фабрики имеют фабричные методы (то есть методы, которые создают и возвращают объекты).

Что касается принципа "открыт / закрыт", то абстрактная фабричная модель по своей природе облегчает это. Код "закрыт" в том смысле, что его не нужно изменять, если вы добавляете новую фабрику (потому что вы используете внедрение зависимостей), и он "открыт" в том смысле, что вы можете расширить функциональность, написав новую абстрактную фабрику.,

ОБНОВЛЕНИЕ: Вот пример кода в вопросе, измененном, чтобы показать абстрактную фабрику:

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();
    }
}

Только из трех заводских моделей Простая фабрика не соответствует принципу открытого-закрытого. Фабричный метод и Абстрактная фабрика, если реализованы должным образом, должны быть закрыты для модификации и открыты для расширения. Статья " Фабричные шаблоны проектирования и принцип открытого замыкания" (OCP), "O" в SOLID, опубликованная на Java-форуме Globinch, дает более правильное объяснение этому. В статье также рассказывается, как настроить простую фабрику, чтобы подчиняться принципу открытого и закрытого типа.

Открытый-закрытый принцип означает "Открытый" для расширения "Закрытый" для изменений. Полагаясь на интерфейс и внедряя это в метод Application.Run(), класс Application отвечает этим принципам. Вы можете расширить его, предоставив новую реализацию IAbstractFormFactory без необходимости вносить изменения.

Посмотрите это на примере реализации абстрактной фабрики (особенно посмотрите пример кода реального мира).

Другие вопросы по тегам