一、简介
Singleton 模式是为了解决获得Singleton类的唯一的实例(或变量),Singleton 模式是设计模式中最为简单、最为常见、最容易实现也是最应该熟悉和掌握的模式。在基于对象的设计中我们可以通过创建一个全局变量(对象)来实现,但全局变量在项目中是能不用就不用的,它是一个定时炸弹,是一个不安全隐患,特别是在多线程程序中,会有很多的不可预测性,同时使用全局变量,也不符合面向对象的封装原则。单例模式却能解决这些问题。
下图是 Singleton 模式的结构图,通过维护一个 static 的成员变量_instance来记录这个唯一的对象实例,通过提供一个 staitc 的接口 Instance (程序中改为GetInstance)来获得这个唯一的实例。
二、详解
1、代码实现
(完整代码已上传到csdn)
(1)代码singleton.h:
#ifndef _SINGLETON_H_
#define _SINGLETON_H_
#include <iostream>
using namespace std;
class Singleton
{
public:
static Singleton *GetInstance();
static void DestoryInstance();
protected:
Singleton();
~Singleton();
private:
static Singleton *_instance;
};
#endif
(2)代码singleton.cpp:
#include <iostream>
#include "singleton.h"
using namespace std;
Singleton *Singleton::_instance = NULL;
Singleton::Singleton()
{
cout<<"Singleton constructor"<<endl;
}
Singleton::~Singleton()
{
cout<<"Singleton destructor"<<endl;
}
void Singleton::DestoryInstance()
{
cout<<"---DestoryInstance"<<endl;
if (_instance) {
delete _instance;
_instance = NULL;
}
}
Singleton *Singleton::GetInstance()
{
cout<<"---GetInstance"<<endl;
if (_instance == NULL) {
cout<<"------new Singleton()"<<endl;
_instance = new Singleton();
}
else {
cout<<"------not new Singleton()"<<endl;
}
return _instance;
}
(3)代码main.cpp:
#include <iostream>
#include "singleton.h"
using namespace std;
int main()
{
Singleton *sign = Singleton::GetInstance();
Singleton *sign2 = Singleton::GetInstance();
Singleton::DestoryInstance();
return 0;
}
(4)makefile:
CFLAGS = -g
DEFINED = #-D _VERSION
LIBS =
CC = g++
INCLUDES = -I./
OBJS= main.o singleton.o
TARGET= main
all:$(TARGET)
$(TARGET):$(OBJS)
$(CC) $(CFLAGS) -o $@ $(OBJS)
.SUFFIXES:.o .h
.SUFFIXES:.cpp .o
.cpp.o:
$(CC) $(DEFINED) -c $(CFLAGS) -o $@ $<
ok:
./$(TARGET)
clean:
rm -f $(OBJS) $(TARGET) core *.log
2、运行结果
(centos6.3系统中运行结果:)
三、总结
(1)Singleton 不可以被实例化,因此需要将构造函数声明为 protected或直接声明为 private,同时也不能delete将析构函数声明为 protected或private。
(2)Singleton 模式在开发中经常用到,并且经常和 Factory(AbstractFactory)模式在一起使用,因为系统中工厂对象只要一个用来创建对象就可以了。
(3)上述Singleton 模式没有考虑到多线程的问题,在多线程的情况下就可能创建多个Singleton实例,可以通过加互斥锁的方式解决,可参看相关博文。
(4)源码已经打包上传到csdn上可登录下载(http://download.csdn.net/detail/taiyang1987912/8403325)。