Я хочу создать альтернативу синглтону

Я понимаю, что существует много дискуссий о синглтонах и о том, почему это плохо. Этот вопрос не об этом. Я понимаю недостатки синглетонов.

У меня есть сценарий, в котором использование синглтона простое и имеет смысл. Однако мне нужна альтернатива, которая позволит выполнить то, что мне нужно, без больших накладных расходов.

Наше приложение спроектировано как клиент, который обычно запускается на портативных компьютерах в полевых условиях и взаимодействует с внутренним сервером. У нас есть строка состояния в нижней части основного приложения. Он содержит несколько текстовых областей, которые показывают различные статуи и информацию, а также несколько значков. Значки меняют свое изображение, чтобы показать свое состояние. Например, значок GPS, который указывает, подключен он или нет, а также состояние ошибки.

Наш основной класс называется MobileMain. Он владеет областью строки состояния и отвечает за ее создание. Затем у нас есть класс StatusBarManager. StatusBarManager в настоящее время является статическим классом, но также может быть одноэлементным. Вот начало урока.

public static class StatusBarManager
{
    static ScreenStatusBar StatusBar;

    /// <summary>
    /// Creates the status bar that it manages and returns it.
    /// </summary>
    public static ScreenStatusBar CreateStatusBar()
    {
        StatusBar = new ScreenStatusBar();
        return StatusBar;
    }

MobileMain запрашивает у StatusBarManager строку состояния. Затем он использует StatusBar. Никакие другие классы не видят StatusBar, только StatusBarManager.

Обновления строки состояния могут поступать практически из любого места приложения. Существует около 20 классов, которые могут обновлять текстовые области в строке состояния, и дополнительные классы, которые обновляют состояния значков.

Будет только один StatusBar и один StatusBarManager.

Есть предложения по лучшей реализации?

Некоторые мысли, которые у меня были:

Сделайте StatusBarManager экземплярным классом. В моем классе MobileMain удерживайте статический общедоступный экземпляр класса StatusBarManager.Затем для обновления строки состояния вы должны вызвать MobileMain.StatusBarManager.SetInformationText или какой-либо другой метод менеджера. StatusBarManager не будет одноэлементным, а MobileMain создаст только его статический экземпляр. Проблема здесь в том, что MobileMain теперь имеет StatusBar и StatusBarManager, который просто управляет своей StatusBar. Также есть глобально доступный статический экземпляр для StatusBarManager, просто другой владелец.

Другая идея состояла в том, чтобы использовать что-то вроде класса EventEggregator. Никогда не пользовался, но читал о них. Я предполагаю, что концепция заключается в том, что это будет глобально доступный класс. В каждом классе, который хочет обновить строку состояния, он публикует событие StatusBarUpdate. StatusBarManager будет единственным классом, подписывающимся на событие StatusBarUpdate и получающим все уведомления. Я читал, что при таком подходе могут возникнуть утечки, если вы не будете осторожны с отпиской от событий при очистке объектов. Стоит ли рассматривать этот подход?

9
задан WPFNewbie 2 May 2012 в 01:10
поделиться