Article:
Singleton và Singleton trong Ogre
1221
phananhvu.myopenid.com 125Over 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.hTruy 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.
Thư viện đồ họa, Design pattern
125