C ++ Singleton / Active Object范例

时间:2013-10-06 21:09:00

标签: c++ oop design-patterns singleton class-design

我想知道如何创建一个创建多个实例的类,即

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

然后,您可以将这些会话视为活动会话。

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

然后在我的代码中的任何一点我都可以去:

Session::getActiveSession();

它将返回活动会话对象或创建一个新对象(如果不存在)。任何时候只有一个会话可以是活动会话,因此如果会话被告知成为活动会话,则旧会话将被停用。

所以我的问题是,我将如何制作这样的东西?

2 个答案:

答案 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();

答案 1 :(得分: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实例Sessions,因为它可以跟踪生成的所有会话(跟踪留作读者的练习)。

您也可以将经理和会话合并到一个班级中,但我发现这种分离更容易理解。