C++单例模式学习
首先,单例模式有以下两个要求: 
*(1)保证一个类之创建一个实例。 
*(2)保证该类的实例可以全局访问。
1. Lazy方式
该模式在调用的时候返回一个实例,如果该实例已经创建,则直接返回已创建好的实例;如果该实例还未创建,则先new一个出来,然后再返回。代码如下:
//in header file
class Singleton {
public:
  Singleton& Instance() {
    if (single_instance == null) {
      single_instance = new Singleton();
    }
    return *single_instance;
  }
  
private:
  Singleton();
  ~Singleton();
  Singleton (const Singleton&);
  Singleton& operator=(const Singleton& s);
  static Singleton* single_instance;
}
//in implementation file
Singleton* Singleton::single_instance = null;
需要注意的是,该方式只需在第一次调用时生成实例。Instance()的返回为引用,这样可以避免该实例在外部被delete;同时,拷贝制构造函数和赋值操作符也被禁用。显然,该方式不是线程安全的,当出现竞争访问时,有可能会出现实例化两次的问题,当然,这种问题可以通过加锁解决。于是,出现了加锁的懒人模式。
2. 加锁的Lazy
代码如下:
//in header file
class Singleton {
  public:
    Singleton& Instance(){
      if (single_instance != null) {
        return *single_instance;
      }
      {
        Lock lock_varible;
        if (single_instance == null) {
          single_instance = new Singleton();
        }
        return single_instance;
      }
    }
  private:
    
    Singleton();
    ~Singleton();
    Singleton(const Singleton& s);
    Singleton& operator=(const Singleton& s);
    static Singleton* single_instance;
}
\\in implementation file
  Singleton* Singleton::single_instance=null;
3. mayer方式
确实很优雅,在函数内部用local static方式声明变量,这样只需要一次初始化。
\\in header file
  class Singleton{
    public:
      Singleton& Instance(){
      static Singleton single_instance;
      return single_instance;
    }
    private:
      Singleton();
      ~Singleton();
      Singleton(const Singleton& s);
      Singleton& operator=(const Singleton& s);
  }
4.Eager 方式
与Lazy方式有点类似,不过在外部完成初始化,不用指针;
  class Singleton{
    public:
      Singleton& Instance(){
        return single_instance;
      }
    private:
      Singleton();
      ~Singleton();
      Singleton(const Singleton& s);
      Singleton& operator=(const Singleton& s);
      
      static Singleton single_instance;
  }
  Singleton Singleton:singleton_instance;