Шаблон проектирования - абстрактный шаблон фабрики и открытый закрытый принцип - PullRequest
3 голосов
/ 10 июля 2009

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

Я пытаюсь использовать 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 ]

5 голосов
/ 10 июля 2009

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

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

ОБНОВЛЕНИЕ: Вот пример кода в вопросе, измененном для отображения абстрактной фабрики:

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();
    }
}
2 голосов
/ 07 июня 2013

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

0 голосов
/ 10 июля 2009

См. this для примера реализации Abstract Factory (особенно посмотрите пример кода реального мира).

0 голосов
/ 10 июля 2009

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

...