1

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

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

  1. 文件系统
  2. 数据库

我已经使用工厂模式从客户端抽象出对象创建细节

界面

public interface ILogException
{
    void LogException();
}

文件系统记录器

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

数据库系统记录器

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

文件系统记录器

  1. 平面文件系统记录器
  2. XMLFileSystemLogger

数据库记录器

  1. SQLSERVER记录器
  2. 甲骨文记录器

我应该如何继续定义FileSystemLoggerFactoryand 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 回答