如果某个类管理了系统中唯一的某种资源,那么我们只能创建该类的一个实例,此时用到singleton设计模式(后面为了简化将省略“设计模式”四个字)就比较合适了。然而,如果不注意实现方法,就很有可能会让我们碰到一些莫名其妙的错误。图1是经过简化所得到的一个实现错误的例子。
- main.c
- 00001: #include <iostream>
- 00002:
- 00003: using namespace std;
- 00004:
- 00005: class singleton1_t
- 00006: {
- 00007: public:
- 00008: static singleton1_t *instance ()
- 00009: {
- 00010: return &instance_;
- 00011: }
- 00012:
- 00013: void count_increase () {count_ ++;}
- 00014: int count () const {return count_;}
- 00015:
- 00016: private:
- 00017: singleton1_t (): count_ (0) {}
- 00018: ~singleton1_t () {}
- 00019:
- 00020: static singleton1_t instance_;
- 00021: int count_;
- 00022: };
- 00023:
- 00024: class singleton2_t
- 00025: {
- 00026: public:
- 00027: static singleton2_t *instance ()
- 00028: {
- 00029: return &instance_;
- 00030: }
- 00031:
- 00032: private:
- 00033: singleton2_t () {singleton1_t::instance ()->count_increase ();}
- 00034: ~singleton2_t () {}
- 00035:
- 00036: static singleton2_t instance_;
- 00037: };
- 00038:
- 00039: singleton2_t singleton2_t::instance_;
- 00040: singleton1_t singleton1_t::instance_;
- 00041:
- 00042: int main ()
- 00043: {
- 00044: (void) singleton2_t::instance ();
- 00045: cout << "count = " << singleton1_t::instance ()->count () << endl;
- 00046: return 0;
- 00047: }
$ g++ main.cpp -o singleton.exe $ ./singleton.exe count = 0
- main.c
- 00001: #include <iostream>
- 00002:
- 00003: using namespace std;
- 00004:
- 00005: class singleton1_t
- 00006: {
- 00007: public:
- 00008: static singleton1_t *instance ()
- 00009: {
- 00010: if (0 == p_instance_) {
- 00011: p_instance_ = new singleton1_t;
- 00012: }
- 00013: return p_instance_;
- 00014: }
- 00015:
- 00016: void count_increase () {count_ ++;}
- 00017: int count () const {return count_;}
- 00018:
- 00019: private:
- 00020: singleton1_t (): count_ (0) {}
- 00021: ~singleton1_t () {}
- 00022:
- 00023: static singleton1_t *p_instance_;
- 00024: int count_;
- 00025: };
- 00026:
- 00027: class singleton2_t
- 00028: {
- 00029: public:
- 00030: static singleton2_t *instance ()
- 00031: {
- 00032: if (0 == p_instance_) {
- 00033: p_instance_ = new singleton2_t;
- 00034: }
- 00035: return p_instance_;
- 00036: }
- 00037:
- 00038: private:
- 00039: singleton2_t () {singleton1_t::instance ()->count_increase ();}
- 00040: ~singleton2_t () {}
- 00041:
- 00042: static singleton2_t *p_instance_;
- 00043: };
- 00044:
- 00045: singleton2_t *singleton2_t::p_instance_ = 0;
- 00046: singleton1_t *singleton1_t::p_instance_ = 0;
- 00047:
- 00048: int main ()
- 00049: {
- 00050: singleton2_t::instance ();
- 00051: cout << "count = " << singleton1_t::instance ()->count () << endl;
- 00052: return 0;
- 00053: }
- main.c
- 00005: class singleton1_t
- 00006: {
- 00007: public:
- 00008: static singleton1_t *instance ()
- 00009: {
- 00010: if (0 == p_instance_) {
- 00011: static singleton1_t instance;
- 00012: p_instance_ = &instance;
- 00013: }
- 00014: return p_instance_;
- 00015: }
- 00016:
- 00017: void count_increase () {count_ ++;}
- 00018: int count () const {return count_;}
- 00019:
- 00020: private:
- 00021: singleton1_t (): count_ (0) {}
- 00022: ~singleton1_t () {}
- 00023:
- 00024: static singleton1_t *p_instance_;
- 00025: int count_;
- 00026: };