设计模式(2)-单例模式(Singleton)
(3) static与单例模式
由于static数据成员存储的位置是固定不变的,实质上,利用指针访问同一静态数据成员的不同实例,是访问同一内存地址。也就是说,访问同一静态数据成员的不同实例,实际上,访问的是同一实例(单例)。
main.cpp下述代码示例,s1、s2、s3,s4,s5是不同实例,分别new了不同的内存。但修改s1->test、s4->test,同时修改了s3,s4,s5三个实例中静态test值。实质上,s1->test、s2->test、s3->test、s4->test、s5->test是“同一”实例。
[html]
//Test2
qDebug()<<s1->test;//s1->test = 1
s2->test++;
qDebug()<<s1->test;//s1->test = 2
qDebug()<<s2->test;//s2->test = 2
Singleton *s4 = new Singleton;
qDebug()<<s4->test;//s4->test = 1
Singleton *s5 = new Singleton;
qDebug()<<s5->test;//s5->test = 1
s1->test++;
s4->test++;
qDebug()<<s1->test;//s1->test = 3
qDebug()<<s2->test;//s2->test = 3
qDebug()<<s3->test;//s3->test = 3
qDebug()<<s4->test;//s4->test = 3
qDebug()<<s5->test;//s5->test = 3
//Test2
qDebug()<<s1->test;//s1->test = 1
s2->test++;
qDebug()<<s1->test;//s1->test = 2
qDebug()<<s2->test;//s2->test = 2
Singleton *s4 = new Singleton;
qDebug()<<s4->test;//s4->test = 1
Singleton *s5 = new Singleton;
qDebug()<<s5->test;//s5->test = 1
s1->test++;
s4->test++;
qDebug()<<s1->test;//s1->test = 3
qDebug()<<s2->test;//s2->test = 3
qDebug()<<s3->test;//s3->test = 3
qDebug()<<s4->test;//s4->test = 3
qDebug()<<s5->test;//s5->test = 3
【UML图】
图1 单例模式UML
1 Singleton应用了单例模式,定义了一个类型为Singleton的私有静态的_instance,一个类型为int的公有的_test,以及一个类型为QString的_name对象。
2 运用静态方法createInstance创建实例。
3 定义了两个公有方法setName()、getName()。
【示例代码】
singleton.h
[html] view plaincopyprint?#ifndef SINGLETON_H
#define SINGLETON_H
#include <QString>
class Singleton
{
public:
Singleton();
private:
static Singleton* _instance;
QString _name;
public:
static int test;
public:
static Singleton *createInstance();
void setName(QString name);
QString getName();
};
#endif // SINGLETON_H
#ifndef SINGLETON_H
#define SINGLETON_H
#include <QString>
class Singleton
{
public:
Singleton();
private:
static Singleton* _instance;
QString _name;
public:
static int test;
public:
static Singleton *createInstance();
void setName(QString name);
QString getName();
};
#endif // SINGLETON_H
singleton.cpp
[html] view plaincopyprint?#include <QDebug>
#include "singleton.h"
Singleton* Singleton::_instance=NULL;
int Singleton::test = 0;
Singleton::Singleton()
{
qDebug()<<"construct";
test = 1;
}
Singleton* Singleton::createInstance()
{
if(_instance == NULL)
{
_instance = new Singleton;
}
return _instance;
}
void Singleton::setName(QString name)
{
_name = name;
}
QString Singleton::getName()
{
return _name;
}
#include <QDebug>
#include "singleton.h"
Singleton* Singleton::_instance=NULL;
int Singleton::test = 0;
Singleton::Singleton()
{
qDebug()<<"construct";
test = 1;
}
Singleton* Singleton::createInstance()
{
if(_instance == NULL)
{
_instance = new Singleton;
}
return _instance;
}
void Singleton::setName(QString name)
{
_name = name;
}
QString Singleton::getName()
{
return _name;
}
main.cpp
[html] view plaincopyprint?#include <QDebug>
#include "singleton.h"
int main(void)
{
Singleton *s1 = Singleton::createInstance();
Singleton *s2 = Singleton::createInstance();
if(s1 == s2)
{
qDebug()<<"s1 , s2 are the same instance";
}
s1->setName("zhangsan");
qDebug()<<s1->getName();
qDebug()<<s2->getName();
s2->setName("lisi");
qDebug()<<s1->getName();
qDebug()<<s2->getName();
//Test1
int i;
i = s1->test;
i = Singleton::test;
s1->createInstance();
Singleton *s3 = new Singleton;
i = s3->test;
//Test2
qDebug()<<s1->test;//s1->test = 1
s2->test++;
qDebug()<<s1->test;//s1->test = 2
qDebug()<<s2->test;//s2->test = 2
Singleton *s4 = new Singleton;
qDebug()<<s4->test;//s4->test = 1
Singleton *s5 = new Singleton;
qDeb
补充:软件开发 , C++ ,