C ++ Синглтон / Парадигма активного объекта

0

Мне было интересно, как вы создадите класс, где вы создадите несколько экземпляров, т.е.

Session o1 = new Session();
Session o2 = new Session();

Затем вы могли бы сделать эти сеансы активным сеансом.

o1.makeActiveSession();
Session::setActiveSession(o2);

Тогда в любой момент моего кода я мог бы пойти:

Session::getActiveSession();

и он будет возвращать активный объект сеанса или создавать новый, если он не существует. Только один сеанс может быть активным сеансом в любой момент времени, поэтому, если сеанс считается активным, тогда старый отключается.

Итак, мой вопрос: как мне сделать что-то подобное?

Теги:
oop
design-patterns
singleton
class-design

2 ответа

1
Лучший ответ

Вы должны иметь возможность использовать большинство общих реализаций Singleton и модифицировать его как менеджера с функциями CreateNew() и SetActive().

// Session.h
class ActiveSessionManager;
class Session
{
public:

protected:
  Session(){};

  void MakeActiveSession();

  friend class ActiveSessionManager;
};

// ActiveSessionManager.h
class ActiveSessionManager
{
public:
  static Session *GetActiveSession()
  {
    if ( s_active == nullptr )
    {
      s_active = new Session();
    }

    return s_active;
  }

  static void SetActiveSession( Session *session )
  {
    s_active = session; 
  }

  static Session *CreateNewSession()
  {
    return new Session();
  }

  static Session *CreateNewActiveSession()
  {
    s_active = CreateNewSession();
    return s_active;
  }

private:
  ActiveSessionManager(){};

  static Session *s_active;
};

// I would put these in cpps.
Session *ActiveSessionManager::s_active = nullptr;

void Session::MakeActiveSession()
{
  ActiveSessionManager::SetActiveSession( this );
}

В моей реализации я разрешаю только ActiveSessionManager экземплярам Session, так как тогда он сможет отслеживать все сгенерированные сеансы (отслеживание остается как упражнение для читателя).

Вы могли бы объединить менеджера и сессию в один класс, но я считаю, что разделение легче следовать.

  • 0
    Спасибо, это большая помощь :)
3

Это одинарный однопользовательский режим:

class Session
{
public:
    static Session& getInstance() {
        static Session s;                   // <-- instantiated upon first call
        return s;
    }

private:
    Session() { }                           // <-- private constructor
    ~Session() { }
    Session(const Session&);                // <-- private copy constructor
    Session& operator=(const Session&);     // <-- private assignment operator
};

используется в качестве:

Session& s = Session::getInstance();
  • 0
    Это классический синглтон, но я думаю, что операционная система хочет, чтобы только 1 была активна за один раз, но все же создала несколько экземпляров за один прогон.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню