1

抽象的なファクトリ パターンを使用して、特定の問題を解決することを計画しています。ファクトリ パターンの実装には成功しましたが、ファクトリ パターンを抽象ファクトリに拡張できませんでした

例外の詳細を保存できる場所が 2 つあります

  1. ファイルシステム
  2. データベース

ファクトリ パターンを使用して、オブジェクト作成の詳細をクライアントから抽象化しました

インターフェース

public interface ILogException
{
    void LogException();
}

FileSystemLogger

public class FileExceptionLogger : ILogException
{
    public  void LogException()
    {
        Console.WriteLine("File Exception Logger");
    }
}

DBSystemLogger

public class DBExceptionLogger : ILogException
{
    public  void LogException()
    {
        Console.WriteLine("DB Exception Logger");
    }
}

工場実装

public class ExceptionFactory
{
    const int i = 1;       
    public static ILogException GetFactory()
    {
        if (i == 1)
        {
            return new FileExceptionLogger();
        }
        else if (i == 2)
        {
            return new DBExceptionLogger();
        }
        else
        {
            return new ServiceExcetionLogger();
        }
    }
}

これが最善の実装ではないことはわかっていますが、変更する予定です。

現在FileSystemLoggerDatabaseLoggerそれ自体がファクトリです。次の実装を and の下にグループ化FileSystemLoggerDatabaseLoggerて、クライアントがFileSystemLoggerFactoryandを持つことができるようにします。DatabaseLoggerFactory

FileSystemLogger

  1. FlatFileSystemLogger
  2. XMLFileSystemLogger

データベースロガー

  1. SQLSERVERLogger
  2. OracleLogger

FileSystemLoggerFactoryとの定義はどのように進めればよいDatabaseLoggerFactoryですか?

4

1 に答える 1

2

必要に応じて、ファクトリ メソッドをジェネリック メソッドにすることもできます。

public static ILogException GetFactory<T>() where T : ILogException
{
    return (ILogException)Activator.CreateInstance<T>();
}

次のように呼び出します。

ILogException logger = ExceptionFactory.GetFactory<FileExceptionLogger>();

また、NInject、Unity などの依存性注入ライブラリを確認することもできます。これらは、この種の問題を単純化し、どのインターフェイスがどの実装にバインドされるかのロジックを一元化できるようにします。(つまり、アプリケーションまたはリクエストのスコープで実装をバインドできます。)

于 2012-12-13T20:50:33.097 に答える