Sigleton e um padrao de projeto definido no Livro Design Patterns: Elements of Reusable Object-Oriented Software. Este padrao diz que para uma determinada classe apenas uma unica instancia deve existir por todo o programa.Em C++ padrao a forma mais simples de se criar uma classe Singleton e utilizar um ponteiro estatico e um metodo estatico. Em SymbianOS isto funciona para EXE mas nao para DLL*. Pois este ponteiro estatico e considerado como um Writable Static Data (variavel global que existe durante toda a vida do processo), e isto nao e permitido para DLLs.Para fazer a criacao de singletons temos duas possibilidades, utilizar a classe base CCoeStatic , ou utilizar Thread Local Storage (TLS). Ate o momento nunca utilizei TLS entao irei focar na utilizacao da classe CCoeStatic. A principal desvantagem na utilizacao de CCoeStatic e que voce nao pode utiliza-lo em aplicacoes baseadas em console (sem User Interface).A logica utilizada sera bem parecida com o singleton em C++ padrao, a diferenca e que nao iremos utilizar um ponteiro estatico. Iremos precisar criar um UID unico para a classe (unico dentro da aplicacao), ele sera utilizado para identificar de qual classe iremos obter a instancia, caso esteja trabalhando com varias classes Singleton.Arquivo: ExemploSingleton.h/* * Exemplo de criacao de classes Singleton utilizando CCoeStatic. * Autor: Leonardo Soares e Silva */#include // Cabecalho de CCoeStatic.class CExemploSingleton : public CCoeStatic{ public: /* Retorna uma instancia desta classe. * Na primeira vez que este metodo for chamado ele fara a criacao da instancia. * Em chamadas subsequentes sera retornada esta instancia. */ static CExemploSingleton* InstanceL(); ~CExemploSingleton(); private: /* Construtor precisa ser privado para evitar que outras classes a instancie diretamente.*/ CExemploSingleton(); /* Construtor de segunda-fase caso precise realizar alguma operacao que possa abandonar */ void ConstructL();};Arquivo: ExemploSingleton.cpp#include "ExemploSingleton.h"/* UID definido para a classe CExemploSingleton.* Este UID precisa ser unico para esta classe dentro da aplicacao.*/const TUid KUidClasseSingleton = { 1 };/* Construcao da classe.* Passamos para CCoeStatic a UID da classe e prioridade de destruicao da instancia.*/CExemploSingleton::CExemploSingleton() : CCoeStatic( KUidClasseSingleton, EDefaultDestructionPriority ){ }CExemploSingleton::~CExemploSingleton(){ // Nao implementado.}CExemploSingleton* CExemploSingleton::InstanceL(){ CExemploSingleton* instancia = static_cast ( CCoeEnv::Static( KUidClasseSingleton ) ); /* Somente entrara neste if na primeira chamada a InstanceL(); * Chamadas subsequentes a este metodo retornarao esta instancia. */ if( !instancia ) { instancia = new (ELeave) CExemploSingleton(); /* Adiciona o ponteiro ao CleanupStack para garatir que esta referencia nao sera perdida caso ConstructL abandone.*/ CleanupStack::PushL( instancia ); /* Chamada ao construtor de segunda-fase */ instacia->ConstructL(); /* Apos chamar metodos que possam abandonar , liberar da pilha */ CleanupStack::Pop( instancia ); } return instancia;}void CExemploSingleton::ConstructL();{ // Nao implementado}O codigo por si so e bastante facil de compreender. Como disse anteriormente basta fazer chamadas ao metodo InstanceL() para receber a referencia da classe Singleton. Na primeira chamada sera alocado o ponteiro e nas outras sera apenas retornado a instancia. Algo que vale ressaltar e a construcao da classe:CExemploSingleton::CExemploSingleton() : CCoeStatic( KUidClasseSingleton, EDefaultDestructionPriority ){ }Passamos atraves do contrutor para CCoeStatic dois argumentos. Uma das definicoes do construtor de CCoeStatic e:CCoeStatic(TUid aUid, TInt aDestructionPriority, TScope aScope=EThread);Onde:aUid = Uid da classe singleton.aDestructionPriority = Define