首页 文章

静态工厂 - 良好的做法?

提问于
浏览
2

我有一个静态日志管理器类,它应该根据参数返回所需 Logger 的实例 .

public static class LogManager {

    private static ILoggerFactory Factory { ... }

    public static ILogger GetLogger(string name) {
        return Factory.Create(name);
    }

}

由于必须设置ILoggerFactory的具体实现(初始化),我想知道我是否应该只保留对实现类型的引用并在每次请求工厂时返回一个新实例 - 或者是否可以保留静态引用实现的实例 .

Version 1

private static Type _factoryType;

public static void SetFactory<TFactory>()
    where TFactory : ILoggerFactory, new()
{
    _factoryType = typeof(TFactory);
}

private static Factory {
    get { return (ILoggerFactory)Activator.CreateInstance(_factoryType);
}

public static ILogger GetLogger(string name) {
    return Factory.Create(name);
}

Version 2

private static ILoggerFactory _loggerFactory;

public static void SetFactory<TFactory>()
    where TFactory : ILoggerFactory, new()
{
    _loggerFactory = (ILoggerFactory)Activator.CreateInstance<TFactory();
}

public static ILogger GetLogger(string name) {
    return _loggerFactory.Create(name);
}

1 回答

  • 2

    可以说,主要区别似乎是延迟加载:v1将在调用 GetLogger 时创建 Logger 类型,而v2将在 SetFactory 期间创建 Logger . 否则没有太大的区别 . 可以将引用作为专用静态字段保存到 Logger 的类型或工厂本身 .

    但是,如果这是 生产环境 代码,我会直接使用日志框架,如nlog或log4net . 这简化了代码并使其更易于维护 . 在这种情况下,构建抽象是过度工程 .

相关问题