之所以引入Singleton设计模式的原因可以从《设计模式C++》中得来:
Singleton模式解决问题十分常见,我们怎样去创建一个唯一的变量(对象)?在基于对象的设计中我们可以通过创建一个全局变量(对象)来实现,在面向对象和面向过程结合的设计范式(如C++中)中,我们也还是可以通过一个全局变量实现这一点。但是当我们遇到了纯粹的面向对象范式中,这一点可能就只能是通过Singleton模式来实现了,可能这也正是很多公司在招聘Java开发人员时候经常考察Singleton模式的缘故吧。
Singleton模式的结构图:
Singleton Pattern结构图
在Singleton模式的结构图中可以看到,我们通过维护一个static的成员变量来记录这个唯一的对象实例。通过提供一个staitc的接口instance来获得这个唯一的实例。
书中的代码例程:
代码说明
Singleton模式的实现无须补充解释,需要说明的是,Singleton不可以被实例化,因此我们将其构造函数声明为protected或者直接声明为private。
下面是我自己的使用案例: 通过Singleton模式来共享刀具参数数据。通过采用boost共享指针实现Singleton模式。
//WorkState.h #pragma once class WorkState { public: ~WorkState(void); static boost::shared_ptr<WorkState> GetInstance(); //刀具参数 int cutter_type; int cutter_num; double cutter_diameter; double cutter_B1; double cutter_B2; double cutter_radius; double cutter_e; double cutter_f; double cutter_Lc; protected: WorkState(void); private: static boost::shared_ptr<WorkState> uniqueInstance; };
//WorkState.cpp #include "StdAfx.h" #include "WorkState.h" boost::shared_ptr<WorkState> WorkState::uniqueInstance; WorkState::WorkState(void): cutter_type(1), cutter_num(1), cutter_diameter(10), cutter_B1(0), cutter_B2(0), cutter_radius(0), cutter_e(0), cutter_f(0), cutter_Lc(0) { } WorkState::~WorkState(void) { } boost::shared_ptr<WorkState> WorkState::GetInstance() { if (uniqueInstance.get()==0) { boost::shared_ptr<WorkState> ptr(new WorkState()); uniqueInstance=ptr; } return uniqueInstance; }