2009-07-10 10 views
3

Я новичок в дизайне.Дизайн шаблона - Абстрактный шаблон завода и открытый закрытый принцип

Я пытаюсь использовать абстрактный шаблон Factory, сохраняя принцип открытого закрывания.

Plz рассмотрим следующий код:

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

может быть примером Abstract Factory Pattern?

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

ответ

4

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

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

UPDATE: Вот пример код в вопросе модифицированного показать абстрактную фабрику:

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

http://stackoverflow.com/questions/1001767/design-patterns-factory-vs-abstract-factory Вы уверены? – 2009-07-10 09:12:02

+0

Вы правильно используете интерфейсы/полиморфизм/зависимость, но фабрики ничего не создают, поэтому они не фабрики. Я добавлю код как пример абстрактной фабрики. –

+0

Спасибо @Tom! Это было более чем полезно. – 2009-07-10 09:59:22

0

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

+0

Но мне нужно постоянно менять класс программы для добавления дополнительных типов. Итак, как вы можете объяснить OCP в этом случае? – 2009-07-10 08:52:58

+1

Ну, это кажется очевидным каждый раз, когда вы хотите что-то добавить, вам придется что-то изменить в коде. Но на уровне класса все остается неизменным. Вы просто добавляете новые классы, которые реализуют интерфейсы, и вам не придется менять какой-либо из уже сделанных классов. –

0

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

+0

О боже! Это самая нечеткая дискуссия. – 2009-07-10 08:26:45

+0

Fuzzy? Нет, хе-хе. Помимо книги PatternFirst Design Pattern, этот сайт очень полезен, я думаю, что он дает неплохой пример для понимания шаблонов. –

2

Из трех заводских моделей только простой завод не в соответствии с открытым закрытым принципом. Заводский метод и абстрактная фабрика, если они выполнены правильно, должны быть закрыты для модификации и открыты для расширения. Статья Factory Design Patterns and Open-Closed Principle (OCP), the ‘O’ in SOLID, опубликованная на форуме Java в Globinch, дает более правильное объяснение этому. В статье также рассказывается, как настроить простой завод, чтобы подчиняться открытому закрытому принципу.