Я думал о классическом выпуске ленивой инициализации синглэна - весь вопрос о неэффективности:
if (instance == null)
{
instance = new Foo();
}
return instance;
Любой, кто знает, что такое Singleton, знаком с проблемой (вам нужно только один раз). Это тривиально, но раздражает.
Итак, я подумал о альтернативном решении, по крайней мере для .NET(хотя он должен работать в любом месте который имеет несколько эквивалентных указателей на функции:
public class Foo
{
private delegate Foo FooReturner();
private static Foo innerFoo;
private static FooReturner fooReturnHandler = new FooReturner(InitialFooReturner);
public static Foo Instance
{
get
{
return fooReturnHandler();
}
}
private static Foo InitialFooReturner()
{
innerFoo = new Foo();
fooReturnHandler = new FooReturner(NewFooReturner);
return innerFoo;
}
private static Foo NewFooReturner()
{
return innerFoo;
}
}
Вкратце - экземпляр возвращает метод делегата. Первоначально делегат настроен на метод который инициализирует ваш экземпляр, а затем изменяет делегат на простой метод Return.
Теперь мне нравится думать, что я не страшен в своей работе, но у меня нет претензий к тому, чтобы быть потрясающим. Я нигде не видел примера этого кода.
Эрго, я пришел к выводу, что чего-то не хватает. Что-то важное. Либо, что вся проблема слишком тривиальная, чтобы думать о том, что многое, или это делает что-то ужасное, что уничтожит вселенную. Или я не в поиске и поэтому не видел сотни разработчиков используют этот метод. Что-то, во всяком случае.
Я надеялся, что хорошие люди здесь, в Stack Overflow, могли бы рассказать мне о том, что (оставив в стороне спор о том, следует ли вообще использовать Singleton).
EDIT для уточнения:
Это не код производительности (хотя, если дизайн активно снижает производительность за пределами традиционной модели, это было бы интересно узнать).
Это было написано просто как доказательство концепции, и я также отдаю себе отчет в том, что он не является потокобезопасным, каким он должен быть. Есть ли какая-то причина, по которой она не может быть потокобезопасной по своей природе?