大话设计模式 第21章 单例模式

单例模式(Singleton), 保证一个类仅有一个实例, 并提供一个访问它的全局访问点.
通常我们可以让一个全局变量使得一个对象被访问, 但它不能防止你实例化多个对象. 一个最好的办法就是, 让类自身负责保存它的唯一实例. 这个类可以保证没有其他实例可以被创建, 并且它提供一个访问该实例的方法.

单例模式的特点:
1. 构造函数为private
2. 有private的static 类指针
3. 有public方法 GetInstance(), 返回static 类指针
4. 有public方法DelInstance(), 释放内存
5. static 类指针的初始化在类定义之外, 一般在cpp中.

SingletonTest.h

#ifndef SINGLETONTEST_H
#define SINGLETONTEST_H

class Singleton
{
public:
    static Singleton* GetInstance();
    static void DeleteInstace();


private:
    Singleton();
    ~Singleton();
    static Singleton* m_pSingleton;

};

#endif

SingletonTest.cpp

#include "SingletonTest.h"
#include <iostream>
// static变量初始化, 也可以 Singleton* Singleton::m_pSingleton = new Singleton(); 然后在GetInstance()内直接返回.
Singleton* Singleton::m_pSingleton = nullptr;
Singleton* Singleton::GetInstance()
{
    if (m_pSingleton == nullptr)
    {
        m_pSingleton = new Singleton();
        std::cout << "实例被创建" << std::endl;
    }
    else
    {
        std::cout << "实例已经被创建, 不做操作" << std::endl;
    }
    return m_pSingleton;
}
void Singleton::DeleteInstace()
{
    if (m_pSingleton != nullptr)
    {
        delete m_pSingleton;
        m_pSingleton = nullptr;
        std::cout << "实例被删除" << std::endl;
    }
    else
    {
        std::cout << "实例指针为空, 不做操作" << std::endl;
    }
}
Singleton::Singleton()
{
}

Singleton::~Singleton()
{
}

main.cpp

#include "SingletonTest.h"
#include <iostream>
int main()
{
    Singleton* p_SingletonA = Singleton::GetInstance();
    Singleton* p_SingletonB = Singleton::GetInstance();

    if (p_SingletonA == p_SingletonB)
    {
        std::cout << "两个实例相同!" << std::endl;
    }

    p_SingletonA->DeleteInstace();
    p_SingletonB->DeleteInstace();

    return 0;
}

输出结果:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值