单例模式c++实现方法总结

一  单例模式介绍

单例模式约束了类的实例化,只允许类创建一个对象。

在用代码实现单例模式之前,先看看单例模式的类结构:

 

特点:

1.  类的构造函数外界不可访问.

2.  提供了创建对象的接口. 

二  单例模式C++实现

1.   实现方法一(只作为样例,不推荐使用)

// .h文件
class SimpleSingleton
{
public:
  ~SimpleSingleton(){}    // 因为外界负责delete,所以须注意析构函数访问权限
  static SimpleSingleton* Instance()
  {
    if(!instance_)                    // 线程不安全,这里需要同步
      instance_ = new SimpleSingleton;
    return instance_;
  }
protected:
  SimpleSingleton(){}  

  static SimpleSingleton* instance_;
};
// cpp文件
SimpleSingleton* SimpleSingleton::instance_ = 0;

该方法是简陋的单例模式实现方式,缺点是:

该类只负责类对象的创建,没有负责销毁,还得程序员负责在合适的时机销毁,所以不推荐使用该方法。

 2  实现方法二(智能指针方式)

// .h文件
class PtrSingleton
{
public:
  ~PtrSingleton(){}   // 必须为public, 智能指针负责析构
  static scoped_ptr<PtrSingleton>& Instance()
  {
    if(NULL == instance_.get())                    // 线程不安全,这里需要同步
      instance_.reset(new PtrSingleton);
    return instance_;
  }
  // other members  
protected:
  PtrSingleton(){}  

  static scoped_ptr<PtrSingleton> instance_;
};

// .cpp文件
scoped_ptr<PtrSingleton> PtrSingleton::instance_;

该方法特点:

1)   避免了手动析构.

2)   值得注意的是实例化接口返回类型不是对象指针、值、引用,而是智能指针.

3)   但在实际使用中要考虑到多线程环境下的使用,Instance接口是线程不安全的,需要同步一下,本篇重点讲单例模式,代码样例中就不做线程同步了.

 3  实现方法三(简单方式)

// .cpp文件
class Singleton
{
public:
  ~Singleton(){}
  static Singleton& Instance(){return instance_;}
  // testing member

protected:
  Singleton(){}  
  Singleton(const Singleton&);
  Singleton& operator=(const Singleton&);

private:
  static Singleton instance_;
};
// .cpp文件
Singleton Singleton::instance_;

这种方法实现起来简单,用起来方便,安全。 

三  单例模式模版实现

// .h文件
template <typename T>
class TSingleton
{
public:
  virtual ~TSingleton(){}    // 必须为public, 智能指针负责析构
  static scoped_ptr<T>& Instance()
  {
    if(NULL == instance_.get())           // 线程不安全,这里需要同步
      instance_.reset(new T);
    return instance_;
  }

protected:
  TSingleton(){}
  TSingleton(const TSingleton<T>&);
  TSingleton<T>& operator=(const TSingleton<T>);

  static scoped_ptr<T> instance_;
};

template<typename T>
scoped_ptr<T> TSingleton<T>::instance_;

单例模版的应用实例

class Derived : public TSingleton<Derived>
{
public:
  // other members

protected:
  Derived(){}
  ~Derived(){}
};

(完)

 


  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值