图形学优化_3: ogre设计模式_Singleton(单例模式)

来源:互联网 发布:r语言导入数据 编辑:程序博客网 时间:2024/04/28 22:31

http://blog.csdn.net/wuzhekai1985/article/details/6665869

  • 由于构造函数是私有的,因此无法通过构造函数实例化,唯一的方法就是通过调用静态函数GetInstance
//Singleton.h  class Singleton    {  public:      static Singleton* GetInstance();  private:      Singleton() {}      static Singleton *singleton;  };  //Singleton.cpp  Singleton* Singleton::singleton = NULL;  Singleton* Singleton::GetInstance()  {      if(singleton == NULL)          singleton = new Singleton();      return singleton;  } 

Singleton类的子类

//Singleton.h#pragma once#include <iostream>using namespace std;class Singleton  {public:    static Singleton* GetInstance(const char* name);    virtual void Show() {}protected: //必须为保护,如果是私有属性,子类无法访问父类的构造函数    Singleton() {}private:    static Singleton *singleton; //唯一实例的指针};//Singleton.cpp#include "Singleton.h"#include "SingletonA.h"#include "SingletonB.h"Singleton* Singleton::singleton = NULL;Singleton* Singleton::GetInstance(const char* name){    if(singleton == NULL)    {        if(strcmp(name, "SingletonA") == 0)            singleton = new SingletonA();        else if(strcmp(name,"SingletonB") == 0)            singleton = new SingletonB();        else             singleton = new Singleton();    }    return singleton;}
//SingletonA.h#pragma once#include "Singleton.h"class SingletonA: public Singleton{    friend class Singleton; //必须为友元类,否则父类无法访问子类的构造函数public:    void Show() { cout<<"SingletonA"<<endl; }private:   //为保护属性,这样外界无法通过构造函数进行实例化    SingletonA() {} };//SingletonB.h#pragma once#include "Singleton.h"class SingletonB: public Singleton{    friend class Singleton; //必须为友元类,否则父类无法访问子类的构造函数public:    void Show(){ cout<<"SingletonB"<<endl; }private:  //为保护属性,这样外界无法通过构造函数进行实例化    SingletonB() {}};
#include "Singleton.h"int main(){    Singleton *st = Singleton::GetInstance("SingletonA");    st->Show();    return 0;}

多线程

  • 多线程情况下加锁(lock)

0 0