12. november 2003 - 10:54Der er
19 kommentarer og 1 løsning
kun et objekt af typen MyFactory
Hvis man vil være sikker på at der kun bliver oprettet et objekt af en bestemt type, hvad skal man så gøre?
Jeg har 2 ideer, men har ikke testet dem.
1. Man laver konstruktøren protected, og tilgår den via en andet sted i klassen og sætter den til at pege på NULL, og så laver en static fkt, der kan lave objektet færdigt hvis det er oprettet og peger på NULL.
2. Implementering af en exception, der tjekker for andre typer af samme objekt?
Ja, det er jeg klar over :D men jeg syntes umiddelbart den klassiske implementering som beskrevet i 1, lyder lidt klodset er der ikke en smartere måde ?
Jeg arbejder samtidig med en test klasse der skal teste klassens fkt'er og members...
Hvordan kunne man evt, lave en test der skulle teste om der eksiterer flere af objekter af samme type, så man kunne bevise man har implementeret sit design-pattern Singleton korrekt... Ved svar øges point til 150... :D
Ideen er god nok, med den counter... Jeg vil bare gerne kunne adskille min test klasser fra mine klasser, da jeg bruger cppUnit-test framework.
Du har ret at det ikke kan gå galt og det har jeg selvfølgelig osse testet og får en compiler fejl, hvis jeg prøver at oprette objekter af typen MyFactory uden for dens klasse.
Da jeg ikke kender så meget til MFC klasserne kunne det evt tænkes at der var nogle fkt der kunne tilgå alle aktive objekter i et bestemt scope eller lign.
Man kan diskutere, om det er smartere, men i de fleste tilfælde hvor jeg skal bruge Singleton pattern, plejer jeg at bruge flg. template klasse Singleton. Ved at bruge den er jeg sikker på at det bliver lavet på samme måde hver gang, og jeg slipper for at have implementationen af det Singleton-specifikke til at ligge i de Singleton klasser jeg bruger:
#ifndef SINGLETON_H #define SINGLETON_H
template<typename T> class Singleton { public: static T * object() // returnerer pointer til objektet. { if ( m_obj == 0 ) { try { m_obj = new T; if ( m_obj == 0 ) throw bad_alloc(); }
catch (...) { exit(1) ; } } return m_obj ; }
static void destroyObject() // destruerer objektet. Skal bruges varsomt. { if ( m_obj ) delete m_obj; m_obj = 0; } protected: Singleton(){} virtual ~Singleton(){} private: static T * m_obj; };
// initiering af static medlem template<typename T> T* Singleton<T>::m_obj = 0 ;
#endif
En klasse, der skal bruge ovenstående erklæres så sådan: #include "singleton.h"
class c1 : public Singleton<c1> { friend class Singleton<c1>; public: int get(); void set(int value); private: int t; c1(){} ~c1(){} };
go' ide, med den template klasse driis, det vil jeg kigge på, hvis tiden ikke løber fra mig...
Arne: I J2EE tror måske det kan være en fordel at man kan bryde singleton-pattern i visse tilfælde men det skal jeg ikke gøre mig klog på, har ikke arbejdt så meget med det...
Det er lavet af andre årsager som bare har den effekt. Man kan iøvrigt sagtens kode det i en J2SE applikation også, men man kommer jo ikke til at oprette egne class loader ved et uheld. I J2EE er det ens app-server som opretter de class loader og man er måske ikke opmærksom på det.
ok, dvs. at hvis man implementere singleton i sin J2EE server app, så kan med fordel lave en counter i sin konstuktør, og hvis man så bruger Junit test så teste om den er større end 1.
Næ fordi hvordan sikrer du dig at der ikke bliver 2 forekomster af counter'en ?
:-)
Det er mere et spørgsmål om at vide hvordan en given app-server opfører sig.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.