单件模式是设计模式中最简单的模式了。
定义: 确保一个类只有一个实例,并提供一个全局的访问点。
- 把一个类设计成自己管理的一个单独实例,同时避免其他类再自行生成实例(所以构造函数用protect或privite)
- 也提供全局的访问点。public函数
看下代码的实现:
1
class
Singleton
2
{
3
protected
:
4
Singleton(){};
5
public
:
6
~
Singleton(){};
7
8
static
shared_ptr
<
Singleton
>
getInstance()
9
{
10
if
(
!
pInstance_.
get
())
11
{
12
pInstance_
=
shared_ptr
<
Singleton
>
(
new
Singleton());
13
return
pInstance_;
14
}
else
{
return pInstance_;
}
15
}
16
private
:
17
static
shared_ptr
<
Singleton
>
pInstance_;
18
};
shared_ptr<Singleton> Singleton::pInstance_ = shared_ptr<Singleton>();
单件的继承//add in 201205-15
对于单件模式, 因为内存模型的关系, 理论上是不能被继承的,但是可以利用c++模板技术实现单件模式的继承:
#include <QObject> template <typename T> class ISingleton : public QObject { private: struct ObjectCreator { ObjectCreator() { ISingleton<T>::instance(); } inline void do_nothing() const { } }; static ObjectCreator objCreator_; protected: ISingleton(){}; public: static T & instance() { static T obj; objCreator_.do_nothing(); return obj; } }; template <typename T> typename ISingleton<T>::ObjectCreator ISingleton<T>::objCreator_;
此段代码从 boost的单件中修改而来。
当需要有一个新的单件类的时候,可以用如下方法:
class TcpCommandControl : public ISingleton<TcpCommandControl> { Q_OBJECT public: ~TcpCommandControl(); void execute(shared_ptr<TcpRequestBase> req, shared_ptr<TcpResponseBase> resp); private: TcpCommandControl(); friend class ISingleton<TcpCommandControl>; private slots: void responseReceiveSlot(QByteArray const& packet); private: shared_ptr<PacketTcpSocket> tcpSocket_; shared_ptr<TcpResponseBase> response_; };