单例模式

单例模式,顾名思义,整个代码只有一个。如类。如果采用单例模式,则需要在静态数据区域上分配个内存,提供给整个程序。他得自己创建整个类实例。

单例模式的使用步骤:
a)     构造函数私有化。// 为不让在类的外部再创建一个本类的实例
b)     提供一个全局的静态方法(全局访问点)来获取单例对象。
c)     在类中定义一个静态指针,指向本类的变量的静态变量指针 。

 

例子如下所示

#define  _CRT_SECURE_NO_WARNINGS 
#include <iostream>

using namespace std;

/*
class A
{
public:
private:
    A() {

    }
};
*/

/*
一是某个类只能有一个实例;
二是它必须自行创建这个实例;
三是它必须自行向整个系统提供这个实例。
*/

/*
单例模式的使用步骤:
a)     构造函数私有化。// 为不让在类的外部再创建一个本类的实例
b)     提供一个全局的静态方法(全局访问点)来获取单例对象。
c)     在类中定义一个静态指针,指向本类的变量的静态变量指针 。
*/


class Singleton
{
public:

    static Singleton* getInstance()
    {
        return instance;
    }

private:
    //不让类的外部再创建实例
    Singleton() {

    }
    static Singleton* instance;//指向本类唯一实例的指针。
};

/*
饿汉式  - 在编译期间就已经确定这个唯一的实例了。
*/
Singleton*  Singleton::instance = new Singleton; //类的内部


class Singleton2
{
public:
    static Singleton2* getInstance()
     {
          //加锁
        if (instance == NULL) {
            instance = new Singleton2;
        }
        //关锁
        return instance;
     }

private:
    Singleton2() {

    }
    static Singleton2 * instance;
};


//懒汉式的初始化方式
Singleton2 *Singleton2::instance = NULL;


int main(void)
{
    Singleton * s1 = Singleton::getInstance();
    Singleton *s2 = Singleton::getInstance();

    if (s1 == s2) {
        cout << "s1 == s2" << endl;
    }
    else {
        cout << "s1 != s2 " << endl;
    }

    Singleton2 *s3 = Singleton2::getInstance();
    Singleton2 *s4 = Singleton2::getInstance();

    if (s3 == s4) {
        cout << "s3 == s4" << endl;

    }
    else {
        cout << "s3 != s4" << endl;
    }
    
    return 0;
}

 

 

如下:打印机的例子(写日志)

#define  _CRT_SECURE_NO_WARNINGS 
#include <iostream>
#include <string>

using namespace std;

class Printer
{
public:
    static Printer *getInstance() {
        return instance;
    }

    void print(string text)
    {
        cout << "打印的内容是" << text << endl;
        sequence++;
        cout << "今天已经打印了 " << sequence << "条数据" << endl;
    }

    static int getCnt() {
        return sequence;
    }

private:
    Printer() {

    }

    //垃圾回收工
    class Garbo {
    private:
        ~Garbo() {
            if (instance != NULL) {
                delete instance;
            }
        }
    };

    static Garbo garbo; //在静态区域开辟一个对象, garbo
    static int sequence; //记录打印机已经打印了多少条数据。
    static Printer* instance;
};

int Printer::sequence = 0;
Printer* Printer::instance = new Printer;
Printer::Garbo  Printer::garbo;
  

int main(void)
{
    //员工1  获取
    Printer *p1 = Printer::getInstance();//获取到唯一的打印机实例
    p1->print("一份简历");

    Printer *p2 = Printer::getInstance();
    p2->print("lol 皮肤");

    Printer *p3 = Printer::getInstance();
    p3->print("离职申请");


    
    return 0;
}

 

posted @ 2020-03-23 13:24  撑雨伞的小男孩  阅读(202)  评论(0编辑  收藏  举报