设计模式(2)-单例模式(Singleton) (一)

2014-11-24 11:48:38 · 作者: · 浏览: 4

(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()<test;//s1->test = 1
s2->test++;
qDebug()<test;//s1->test = 2
qDebug()<test;//s2->test = 2
Singleton *s4 = new Singleton;
qDebug()<test;//s4->test = 1
Singleton *s5 = new Singleton;
qDebug()<test;//s5->test = 1

s1->test++;
s4->test++;
qDebug()<test;//s1->test = 3
qDebug()<test;//s2->test = 3
qDebug()<test;//s3->test = 3
qDebug()<test;//s4->test = 3
qDebug()<test;//s5->test = 3
//Test2
qDebug()<test;//s1->test = 1
s2->test++;
qDebug()<test;//s1->test = 2
qDebug()<test;//s2->test = 2
Singleton *s4 = new Singleton;
qDebug()<test;//s4->test = 1
Singleton *s5 = new Singleton;
qDebug()<test;//s5->test = 1

s1->test++;
s4->test++;
qDebug()<test;//s1->test = 3
qDebug()<test;//s2->test = 3
qDebug()<test;//s3->test = 3
qDebug()<test;//s4->test = 3
qDebug()<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

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

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
#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
#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
#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()<getName();
qDebug()<getName();
s2->setName("lisi");
qDebug()<getName();
qDebug()<getName();

//Test1
int i;
i = s1