首页 > 其他分享 >单例模式

单例模式

时间:2023-06-20 21:55:31浏览次数:32  
标签:pinstance 模式 AutoRelease singleinstance static 单例 class

1. 将构造函数私有化
2. 在类中定义一个静态的指向本类型的指针变量
3. 定义一个返回值为类指针的静态成员函数
  • 四种单例模式的实现
  • 1.全局类+单例类(全局类负责回收单例类对象堆空间)
#include <iostream>
using namespace std;

class singleinstance{
public:
    static singleinstance * getInstance();
    friend class AutoRelease;
private:
    static singleinstance* _pinstance;
    singleinstance();
    ~singleinstance();
};

class AutoRelease{
public:
    AutoRelease(singleinstance*);
    ~AutoRelease();
private:
    singleinstance* _psingle;
};

AutoRelease::AutoRelease(singleinstance* p)
:_psingle(p)
{
    cout << "AutoRelease()" << endl;
}

AutoRelease::~AutoRelease()
{
    if(_psingle)
    {
        delete  _psingle;
        _psingle = nullptr;
    }   
    cout << "~AutoRelease()" << endl;
}
    
singleinstance * singleinstance::_pinstance = nullptr;                                                                                                                              
singleinstance::singleinstance()
{
    cout << "singleinstance()" << endl;
}

singleinstance::~singleinstance()
{
    cout << "~singleinstance()" << endl;
}

singleinstance* singleinstance::getInstance()
{
    if( _pinstance == nullptr )
        _pinstance = new singleinstance();
    return _pinstance;
}
  • 2.单例类+嵌套类(嵌套类负责回收单例类对象堆空间)
#include <iostream>
using namespace std;

class singleinstance
{
public:
    static singleinstance *getInstance();

private:
    class AutoRelease;
    static AutoRelease rel;
    static singleinstance *_pinstance;
    singleinstance();
    ~singleinstance();
};

class singleinstance::AutoRelease
{
public:
    AutoRelease();
    ~AutoRelease();
};

singleinstance::AutoRelease::AutoRelease()
{
    cout << "AutoRelease()" << endl;
}

singleinstance::AutoRelease::~AutoRelease()
{
    if (_pinstance)
    {
        delete _pinstance;
        _pinstance = nullptr;
    }
    cout << "~AutoRelease()" << endl;
}

singleinstance *singleinstance::_pinstance = nullptr;
singleinstance::AutoRelease singleinstance::rel;

singleinstance::singleinstance()
{
    cout << "singleinstance()" << endl;
}

singleinstance::~singleinstance()
{
    cout << "~singleinstance()" << endl;
}

singleinstance *singleinstance::getInstance()
{
    rel;
    if (_pinstance == nullptr)
    {
        _pinstance = new singleinstance();
    }
    return _pinstance;
}
  • 3.单例类+atexit
#include <iostream>
using namespace std;

class singleinstance
{
public:
    static singleinstance *getInstance();
    static void destroy();

private:
    static singleinstance *_pinstance;
    singleinstance();
    ~singleinstance();
};

singleinstance *singleinstance::_pinstance = nullptr;

singleinstance::singleinstance()
{
    cout << "singleinstance()" << endl;
}

singleinstance::~singleinstance()
{
    cout << "~singleinstance()" << endl;
}

singleinstance* singleinstance::getInstance()
{
    if(!_pinstance){
        _pinstance = new singleinstance();
        atexit( destroy );
    }   
    cout << "singleinstance::getInstance()" << endl;
    return _pinstance;
}
  • 4.单例类+pthread_once+atexit
#include <iostream>
using namespace std;

class singleinstance
{
public:
    static singleinstance *getInstance();
    static void destroy();
    static void init();

private:
    static pthread_once_t _once;
    static singleinstance *_pinstance;
    singleinstance();
    ~singleinstance();
};

singleinstance *singleinstance::_pinstance = nullptr;
singleinstance::singleinstance()
{
    cout << "singleinstance()" << endl;
}

singleinstance::~singleinstance()
{
    cout << "~singleinstance()" << endl;
}

pthread_once_t singleinstance::_once = PTHREAD_ONCE_INIT;

singleinstance *singleinstance::getInstance()
{
    pthread_once(&_once, init);
    cout << "singleinstance::getInstance()" << endl;
    return _pinstance;
}

void singleinstance::init()
{

    if (_pinstance == nullptr)
        _pinstance = new singleinstance();

    atexit(destroy);
    cout << "singleinstance::init" << endl;
}

void singleinstance::destroy()
{
    if (_pinstance)
    {
        delete _pinstance;
        _pinstance = nullptr;
    }
    cout << "singleinstance::destroy" << endl;
}

标签:pinstance,模式,AutoRelease,singleinstance,static,单例,class
From: https://www.cnblogs.com/skycrash/p/17494191.html

相关文章

  • 设计模式之工厂模式
    工厂模式是一种对象创建型模式,它提供了一种创建对象的最佳实践。在工厂模式中,我们在创建对象时不使用new关键字,而是通过调用工厂方法来创建对象。工厂方法是一种在子类中定义的方法,该方法负责实例化对象。工厂方法可以返回不同的对象类型,因此工厂模式可以创建一组相关或不相关的......
  • 电销机器人,颠覆传统的电销模式
    电销机器人是帮你搭建一个电销后台,对接属于你的专属线路,录制属于你的真人语音话术,帮你代替真人自动拨打电话,把打出来的意向客户自动推送到你的微信上面。电销机器人是非常有用的,它和传统的人工电销不一样。第一、减低人力成本:一个电话销售员从工资、培训、补贴、奖金一个月做少要40......
  • 浅谈项目核算的“全程利润”实现模式
    “怎样评估各事业群/项目群的业绩?如何引导决策?”“今年的利润怎么分配?没有细化的分配依据,怎么办?”“开了这么多类型的项目,是不是有些盲目?资源这么紧张,明年要怎么做?”这一系列的问题,几乎所有的企业都会面临,怎么破?怎么解?用友针对以上困惑推出了一项新的解决方案“项目财务管理PFM”,将......
  • API模式HTTP使用代码模板
    以下是一个使用Python的HTTPAPI请求的代码模板:importrequests#设置请求的URL和参数url='http://example.com/api'params={'param1':'value1','param2':'value2'}#发送HTTPGET请求response=requests.get(url,params=params)#......
  • 桥接模式-09
    概述桥接模式(BridgePattern)又称柄体(HandleandBody)模式、接口模式。它将可能有着继承关系的对象的抽象和实现分离,使得两者可以独立地变化。优点:分离了抽象部分和实现部分,提高了灵活性和可扩展性,隐藏了实现的细节。缺点:降低了系统可理解性,提高了设计难度,有一定的局限......
  • 【OpenGL修行】点线面模式设置
    文章目录点点的大小切换线线的宽窄设置虚线绘制多边形多边形正反绘制&反转多边形表面剔除多边形表面镂空通过初始化数组设置镂空样式通过读取bmp文件设置镂空样式点点的大小切换通过glPointSize()函数即可实现点的大小控制,我画了两个大小不同的点,还是挺明显的。voiddisplay1(){......
  • Java设计模式之代理模式--经纪人的工作
    前言本文主要讲述代理模式,文中使用通俗易懂的案例,使你更好的学习本章知识点并理解原理,做到有道无术。一.什么是代理模式代理模式是23种设计模式中结构型模式的一种,它的核心是通过代理类来完成其他对象的访问,降低访问者和被访问者的耦合度,也对功能进行了增强。二.生活中的代理......
  • 万字详解常用设计模式
    本文是博主在工作中对常用设计模式的使用经验总结归纳而来分享给大家。设计模式一共有23种,本文讲解涉及如下:责任链模式模板方法模式发布订阅模式策略模式三大分类业界一般将设计模式分为三大类:创建型模式:对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象......
  • Go 设计模式|组合,一个对数据结构算法和职场都有提升的设计模式
    Go设计模式|组合,一个对数据结构算法和职场都有提升的设计模式原创 KevinYan11 网管叨bi叨 2023-01-1608:45 发表于北京收录于合集#用Go学设计模式24个大家好,我是每周在这里陪你进步的网管~,这次我们继续设计模式的学习之旅。本次要学习的是组合模式,这个模式呢,平时要做......
  • SAP Commerce Cloud的SmartEdit 不同模式的介绍
    SAPCommerceCloud的SmartEdit提供了不同的模式(Mode),包括PreviewMode(预览模式)、BasicEditMode(基本编辑模式)和AdvancedEditMode(高级编辑模式)。这些模式为用户提供了不同的功能和工作环境,以满足其编辑和管理网站内容的需求。PreviewMode(预览模式):PreviewMode是SmartEdit的......