【问题标题】:Refactoring on static Factory class where the other Factory class needs to use its private method重构静态工厂类,其他工厂类需要使用其私有方法
【发布时间】:2021-08-06 15:42:33
【问题描述】:

在我的代码库中有一个现有的 ConnectionFactory 用于多个地方。我最近添加了 AdvancedConnection,它是 Connection 类的扩展。 在 AdvancedConnectionFactory 中,在 CreateAdvancedConnection 中我想使用与 ConnectionFactory 中相同的模板逻辑。然后返回带有选项的 AdvancedConnection 的新实例。我的 AddTemplate 逻辑很大,我不想复制它。在 AdvancedConnectionFactory 中使用 AddTemplate 逻辑的推荐方式是什么?

public static class ConnectionFactory
{
    public static Connection CreateConnection(Options options)
    {
        return new IntermediateMethod1(options);
    }

    private static Connection IntermediateMethod1(Options options)
    {
        AddTemplate(options);
        return new Connection(options);
    }

    private static void AddTemplate(Options options)
    {
        // do some templating stuff on the connection string
        options.ConnectionString = "some templated string";
    }
}

public static class AdvancedConnectionFactory
{
    public static AdvancedConnection CreateAdvancedConnection(Options options)
    {
        // Need to use the same logic of AddTemplate from ConnectionFactory
        return new AdvancedConnection(options);
    }
}

【问题讨论】:

  • 如果您只返回单个类(连接)的实例,不确定为什么要使用工厂类。如果 Connection 是 AdvancedConnection 的基类,则应将代码添加到 ConnectionFactory.CreateConnection 以根据选项的值返回 Connection 或 AdvancedConnection 的实例。这就是工厂模式的用途。
  • 取决于你想要做什么,这对于Stack Exchange Code Review来说可能是一个更好的问题

标签: c# .net architecture refactoring


【解决方案1】:

我认为你可以找到很多方法来做到这一点,但我个人会选择这种方法:

public abstract class ConnectionFactoryBase<T> where T : class, new()
{
    private static T _instance;

    public static T GetInstance()
    {
        if(_instance == null)
            _instance = new T();
        return _instance;
    }
    
    public abstract Connection CreateConnection(Options options);

    protected void AddTemplate(Options options)
    {
        // do some templating stuff on the connection string
        options.ConnectionString = "some templated string";
    }
}

public class ConnectionFactory : ConnectionFactoryBase<ConnectionFactory>
{
    public override Connection CreateConnection(Options options)
    {
        return IntermediateMethod1(options);
    }

    private Connection IntermediateMethod1(Options options)
    {
        AddTemplate(options);
        return new Connection(options);
    }
}

public class AdvancedConnectionFactory : ConnectionFactoryBase<AdvancedConnectionFactory>
{
    public override Connection CreateConnection(Options options)
    {
        return CreateAdvancedConnection(options);
    }
    
    public AdvancedConnection CreateAdvancedConnection(Options options)
    {
        AddTemplate(options);
        return new AdvancedConnection(options);
    }
}

(AddTemplate 逻辑需要保护)

这是一个如何工作的示例: https://dotnetfiddle.net/SkQC4E

【讨论】:

    猜你喜欢
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多