设计模式----单例模式 【含实例】

单例模式,非常常见的一种设计模式。

需求

一个类提供访问该类对象的唯一方式,且全局中有且仅有唯一一个该类的实例。

实现方式

1.构造函数private,类外不可创建类实例

2.提供访问类实例的接口getInstance

3.创建static private的类对象

代码

//main.h
#ifndef MAIN_H
#define MAIN_H
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>

class MyObject
{
public:
    static MyObject* getInstance();
    ~MyObject(){std::cout<<"~MyObject()"<<std::endl;}

private:
    static MyObject* g_myObject;
    MyObject(){}

    // GC 机制
    class GC
    {
    public:
        ~GC()
        {
            if (g_myObject != NULL) {
                std::cout<<"Here destroy the g_myObject..." << std::endl;
                delete g_myObject;
                g_myObject = NULL;
            }
        }
        static GC gc;  // 用于释放单例
    };

};

#endif // MAIN_H
#include "main.h"
#include "unistd.h"

MyObject::GC MyObject::GC::gc; // 重要
MyObject* MyObject::g_myObject = NULL;

MyObject* MyObject::getInstance(){
   if(NULL == g_myObject)
   {
       g_myObject = new MyObject();
   }
   return g_myObject;
}

int main(int argc, char *argv[])
{
    printf("========hello======\n");
    MyObject * obj = MyObject::getInstance();

    sleep(5);

    printf("-------exit--------\n");

    return 0;
}

输出结果

Starting /home/user/build-TestList-Desktop_Qt_5_9_5_GCC_64bit-Debug/TestList...
========hello======
-------exit--------
Here destroy the g_myObject...
~MyObject()
/home/user/build-TestList-Desktop_Qt_5_9_5_GCC_64bit-Debug/TestList exited with code 0

总结

学习中发现了博主写的释放资源时采用gc机制,很受用。

可以看出如果删去GC类的代码部分,程序退出时,static对象指针指向的对象不会被析构,即系统不会自动去调用MyObject的析构函数去释放g_myObject指向的对象。
例如:

class A{

};

static A a;//会析构

static A* a = new A();//不会被析构

但是代码中的static GC gc;在程序结束时会调用gc的析构函数,同时delete g_myObject。

 

 

参考大神博客https://blog.csdn.net/liang19890820/article/details/61615495#commentsedit

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值