2009-07-10 11 views
3

私はデザインパターンの初心者です。デザインパターン - 抽象ファクトリーパターンとオープンクローズド原則

私は、Open-Closed Principleを維持しながら抽象ファクトリパターンを使用しようとしています。

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パターンの例になることができますか?

「はい」の場合は、オープン・クローズド・プリンシプルという概念をどのように組み込んでリファクタリングできますか?

答えて

4

あなたが与えた例は、抽象的な工場ではありません。抽象ファクトリにはファクトリメソッド(つまり、オブジェクトを作成して返すメソッド)があります。

オープン/クローズド原理については、抽象的な工場パターンが本質的に容易になります。コードは、新しいファクトリを追加する場合(依存性注入を使用しているため)、変更する必要がなく、新しい抽象ファクトリを作成して機能を拡張できるという点で「オープン」ですという点で、「クローズ」です。

UPDATE:だけの簡単な工場がオープンクローズする原則に従ってされていない3つの工場出荷時のパターンのうち

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 本当ですか? –

+0

インタフェース/多態性/依存性注入を正しく使用していますが、ファクトリは何も作成していないので、実際にファクトリではありません。私は、抽象的なファクトリの例としていくつかのコードを追加します。 –

+0

ありがとう@トム!それは助けになる以上のものでした。 –

0

オープンクローズド(Open-Closed)とは、変更を「クローズ」するための「オープン」を意味します。インターフェイスに依存し、これをApplication.Run()メソッドに注入することで、Applicationクラスはこれらの原則を満たします。変更を加えることなく、IAbstractFormFactoryの新しい実装を提供することで拡張できます。

+0

しかし、私は、さらにタイプを追加するために、常にProgramクラスを変更しなければなりません。では、この場合、OCPについてはどうしたら説明できますか? –

+1

まあ、何かを追加したいときはいつも、コード内の何かを変更する必要があることは明らかです。しかし、クラスレベルでは、すべてが同じままです。インターフェイスを実装する新しいクラスを追加するだけで、すでに作成されたクラスを変更する必要はありません。 –

0

例えば、Abstract Factoryの実装例(特に実際のサンプルコードを参照)を参照してください。this

+0

ああ神様!これは最も曖昧な議論です。 –

+0

ファジー?ナ、ヘヒェ。 HeadFirst Design Patternの本の横にあるこのサイトは、パターンを理解するための良い例を与えるのに非常に役立ちます。 –

2

:ここでは、例のコードは抽象工場を表示するように変更問題です。ファクトリメソッドと抽象ファクトリが正しく実装されている場合は、変更のために閉じて拡張用に開く必要があります。記事Factory Design Patterns and Open-Closed Principle (OCP), the ‘O’ in SOLIDがGlobinch java forumに掲載されています - これについてはより適切な説明があります。この記事では、開かれた閉鎖の原則に従うための簡単な工場の調整方法についても説明します。

関連する問題