当前位置:编程学习 > C/C++ >>

设计模式(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++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,