更多教程笔记请查看我的上一篇文章:点击跳转

C++设计模式自学之旅开始!

本次将介绍C++设计模式里比较基础的模式:单例模式

C++的设计模式很早就有了,不过我后面去学Qt了,一直没有时间好好把设计模式过一遍,下次有时间我再更新关于Qt的教程……

据说所有的大公司,软件设计的开发人员,都恨不得给自己写的所有代码都套上设计模式,是否真的有那么玄呢? 今天我们来一探其中的奥秘

单例模式代码:

//设计模式-单例模式
#include <iostream>
using namespace std;

//所谓单例模式就是程序只有一个实例
class Singleton
{
public:
    ~Singleton()
    {
        cout << "~Singleton() construct" << endl;
    }

    //提供一个接口来让用户创建对象,让用户只能通过这种方式创建
    //加上static是因为如果用户没有对象那么就无法创建对象,于是可以把这个接口定义到全局变为静态
    // static Singleton *CreateObject()
    // {
    //     //如果一开始对象的指针是空那么就创建对象
    //     if (m_pObject == nullptr)
    //     {
    //         m_pObject = new Singleton();
    //     }
    //     return m_pObject;
    // }

    //最安全的写法,不会造成内存泄漏
    static Singleton &CreateObject()
    {
        //创建一个静态成员
        static Singleton obj;

        //返回这个成员变量,永远只返回这一个
        return obj;
    }

    //如果用户调用拷贝构造函数就直接释放
    Singleton(Singleton &obj) = delete;

    //利用运算符重载禁用拷贝构造函数
    Singleton *operator=(Singleton &obj) = delete;

private:
    //将构造函数私有化来限制构造函数只允许创建一个对象
    Singleton()
    {
        cout << "Singleton() construct" << endl;
    }

    //限制拷贝构造函数 让用户只能用引用来接收 不能用拷贝的方式接收
    // Singleton(Singleton &obj)
    // {
    //     cout << "Singleton(Singleton& obj) construct" << endl;
    // }

    //定义一个静态对象指针用来判断接口是否只创建了一次对象
    //静态对象指针只能访问静态的成员函数
    // static Singleton *m_pObject;
};

//将静态对象指针声明
// Singleton *Singleton::m_pObject = nullptr;

int main()
{
    //当构造函数不公有化了就无法再通过直接创建对象的方式调用构造函数
    // Singleton s1;
    // Singleton s2;
    // Singleton *pObj1 = Singleton::CreateObject();

    //需要手动释放指针才不会造成内存泄漏
    // // delete pObj1;

    // Singleton *pObj2 = Singleton::CreateObject();

    //安全的写法,返回一个静态成员变量的引用,用引用来接收
    Singleton &pObj1 = Singleton::CreateObject();

    //错误 无法通过拷贝构造接收
    // Singleton pObj2 = Singleton::CreateObject();

    return 0;
}