3

デザインパターン初心者です。

Open-Closed Principleを維持しながら、Abstract Factory-パターンを使用しようとしています。

次のコードを見てください。

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

はいの場合、Open-Closed Principle の概念を組み込んでリファクタリングするにはどうすればよいですか?

4

4 に答える 4

6

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

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

更新:抽象ファクトリを表示するように変更された質問のコード例を次に示します。

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();
    }
}
于 2009-07-10T08:57:41.150 に答える
3

3 つの工場パターンのうち、単純な工場のみ開閉原理はありません。ファクトリ メソッドと抽象ファクトリが適切に実装されている場合は、変更のために閉じ、拡張のために開く必要があります。Globinch Java フォーラムで公開されている SOLID の「O」である Factory Design Patterns and Open-Closed Principle (OCP)の記事では、これについてより適切な説明が提供されています。この記事では、単純なファクトリを調整してオープン クローズの原則に従う方法についても説明します。

于 2013-06-07T05:27:40.973 に答える
0

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

于 2009-07-10T08:04:54.940 に答える
0

抽象ファクトリの実装の例については、これを参照してください(特に実際のサンプルコードを参照してください)。

于 2009-07-10T08:05:09.713 に答える