在c#中为不同的异常提供程序实现抽象工厂模式

时间:2012-12-13 20:44:28

标签: c# design-patterns factory-pattern

我计划通过使用抽象工厂模式解决特定问题。我成功实现了工厂模式,但无法将工厂模式扩展到抽象工厂

我有两个不同的地方可以存储异常细节

  1. 文件系统
  2. 数据库
  3. 我使用工厂模式从客户端

    中抽象出对象创建细节

    接口

    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本身就是一个工厂,我想在FileSystemLoggerDatabaseLogger下对实施进行分组,以便客户可以FileSystemLoggerFactoryDatabaseLoggerFactory

    FileSystemLogger

    1. FlatFileSystemLogger
    2. XMLFileSystemLogger
    3. DatabaseLogger

      1. SQLSERVERLogger
      2. OracleLogger
      3. 如何继续定义FileSystemLoggerFactoryDatabaseLoggerFactory

1 个答案:

答案 0 :(得分:2)

如果需要,可以将工厂方法设为通用方法:

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

称之为:

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

您还可能需要查看依赖注入库,如NInject,Unity等。这些可以简化此类问题,允许您集中接口绑定到哪些实现的逻辑。 (即,您可以在应用程序或请求范围中绑定实现。)