К сожалению, шаблон Singleton действительно не может вам здесь помочь, так как этот шаблон специально предназначен для возврата одного и только одного экземпляра за время существования приложения.
Синглтоны полезны в некоторых случаях, таких как ведение журнала, однако их обычно избегают, поскольку общеизвестно, что их трудно макетировать, тестировать и расширять.
По возможности яРекомендую рефакторинг приведенного выше кода для использования Инверсия шаблона управления и конструктор внедрения зависимости.Это достигается созданием интерфейса, скажем, ILibrary
и наличием двух реализаций.
Эти реализации могут быть созданы один раз и сохранены для эмуляции Синглтоноподобного поведения в третьем вспомогательном классе.Действительно хороший способ сделать это в корпоративном приложении - это использовать Контейнер внедрения зависимостей , который поддерживает время жизни экземпляров (Singleton или Transient) и позволяет легко внедрять их в конструкторы.
Пример кода с использованием IoC / DI в качестве шаблона будет выглядеть следующим образом:
public class A
{
private readonly ILibrary _library;
public A(ILibrary library)
{
_library = library;
}
public DoSomething()
{
_library.DoStuff();
}
}
public class B
{
private readonly ILibrary _library;
public B(ILibrary library)
{
_library = library;
}
public DoSomething()
{
_library.DoStuff();
}
}
public interface ILibrary
{
void DoStuff();
}
public class LibraryTypeOne : ILibrary
{
void DoStuff()
{
Console.WriteLine("I am library type one");
}
}
public class LibraryTypeTwo : ILibrary
{
void DoStuff()
{
Console.WriteLine("I am library type two");
}
}
public static class MyProgram
{
var a = new A(new LibraryTypeOne()); // Note, you need to store
var b = new B(new LibraryTypeTwo()); // these instances somewhere to
// share throughout the app
a.DoSomething();
b.DoSomething();
}