c# - 重构静态工厂类,其他工厂类需要使用其私有方法
问题描述
在我的代码库中,有一个在多个地方使用的现有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);
}
}
解决方案
我认为您可以找到很多方法来做到这一点,但我个人会选择这种方法:
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
推荐阅读
- elasticsearch - 如何扩展弹性搜索日期范围直方图聚合查询?
- python - Python:在构建器外部实例化类时引发警告
- c++ - 将 bash 参数传递给 C++
- javascript - JS过滤数组与另一个数组的对象
- apache-kafka - Accessing Kafka clusters using DNS
- python - Pytesseract 因 PermissionError 失败:[WinError 5] 由于文件不可删除,访问被拒绝
- c# - TDLib: Download a file without saving to disk
- mysql - 在 MariaDB 中传递命名参数的语法是什么?
- max - 将结果集从用户定义的函数传递到 max() 函数
- laravel - Laravel,迁移关系在某个时间结束