Vinova tuyển lập trình viên Mobile & Web ở Hà Nội, lương $300-1000

Article: Singleton và Singleton trong Ogre 1221

Thư viện đồ họa, Design pattern
phananhvu.myopenid.com 125
Over 4 years ago

Trong Singleton, chỉ có một instance của class tồn tại ở một thời điểm. Instance đó có thể được truy xuất ở bất cứ đâu trong chương trình. Đây là một design pattern rất hữu dụng trong một số trường hợp. Tuy nhiên, khi dùng phải chú vài điều. Hơn nữa, Singleton là design pattern được sử dụng khá nhiều trong các "manager" class của Ogre3D.

Bài này xin giới thiệu về Singleton nói chung và về cách Singleton được sử dụng trong Ogre3D.

Singleton

Singletons là một design pattern(cách thức để tạo ra class phù hợp với mọi project). Có rất nhiều implementation khác nhau nhưng tự chung lại: chỉ có DUY NHẤT MỘT instance của class.

Ví dụ về Menu manager:

// Class Declaration
class MenuManager
{
public :

// Constructor
MenuManager();

// Destructor
~MenuManager();

// SingleTon Instance
// Singleton Instance of our Menu manager
static MenuManager &Instance();

// Create Main Menu
void CreateMainMenu();

private:
InheritedBase *m_BaseMenu;
MainMenu * m_MainMenu;
};

File .cpp

//SingleTon Instance
MenuManager &MenuManager::Instance()
{
static MenuManager instance;
return instance;
}


// Create MainMenu
void MenuManager::CreateMainMenu()
{
m_MainMenu = new MainMenu();
m_MainMenu->CreateMainMenu();
}

Trong các file khác, chỉ việc include:

#include MenuManager.h

Truy cập:

MenuManager::Instance().CreateMainMenu();

Singleton trong Ogre3D

Ogre thực hiện Singleton hơi khác so với giải pháp trình bày ở trên:

  • Ogre::Singleton là một template, nghĩa là phải khởi tạo Singleton với kiểu nào đó. Cách này giúp chúng ta quản lí tất cả Singleton với một code chung nhất làm cho code dễ bảo trì nhất.
  • Để dùng Ogre::Singleton, phải gọi constructor của Singleton class, sau đó mới nhận được reference của instance. Cách này tạo bản singleton khi instance được tạo ra lần đầu tiên.

Giả sử chúng ta muốn tạo class sau thành Singleton:

class MyManager
{
public:
MyManager();
void doSomething();
};

Chúng ta làm như sau:

#include 
class MyManager : public Ogre::Singleton
{
public:
MyManager();
void doSomething();
static MyManager& getSingleton(void);
static MyManager* getSingletonPtr(void);
};

Khi đó, sử dụng class trên như sau:

// Creating the manager. This may only be called once!
new MyManager();

// Obtaining a reference to the manager instance
MyManager& mgr = MyManager::getSingleton();

// Obtaining a pointer to the manager instance
MyManager* pMgr = MyManager::getSingletonPtr();

Tham khảo: Ogre Wiki.

Comments

You must login to be able to comment

Uploaded files

No file uploaded yet

You must login to be able to upload

Nhà tài trợ:

Mọi người đều tự do viết bài, sửa bài của người khác, và bình luận ở trang web này. Bạn muốn chủ động tạo bài mới để chia sẻ kinh nghiệm với mọi người? Xin click link ở dưới.

Create new content