单例模式

1 当你希望资源不管谁用,都是一样的一份的时候;用单例模式

2 普通的类,构造,和析构是public的,因为你要new对象,new 要做的就是开辟空间,并调用构造;这个是一个针对公有函数的调用;(私有函数你在外边是看不到的)

3 单例模式就是 不管你get多少次,就一份;在程序中,能表示“仅有一份”的,还能用在类里边的  -> static;

4 如何保证每次创建都是同一个对象。首先绝对不能多次的new,也就不能有 "公有构造"

class A{

private:

          static A * a;

//私有构造

          A(){ }; //外边不能用new创建对象,因为构造函数是私有的,用new创建对象会编译报错
~A(); public:
static A* getinstance() { //a是静态的就只有一个 if(a == null) { a= new A(); }//走到这里调用的构造函数 return a; } }

 两种实现方法:

1 屎到屁股门再拉;懒汉模式;用的时候在初始化成员变量的实例

#include <iostream>
#include <memory>
using namespace std;

class MyClass
{
private:
    MyClass() {
        printf("construct .........");
    };
    
private:
    static MyClass *obj ;

public:
    ~MyClass() {};
    static MyClass* getinstance()
    {
        if (!obj)
        {
             obj  = new MyClass();
        }
        return obj;
    }

};

MyClass* MyClass::obj = nullptr;//vs2015需要给类内静态成员变量初始化;

int main()
{
    void* obj = MyClass::getinstance();
    return 0;
}

在C++中,类的静态成员(static member)必须在类内声明,在类外初始化;因为这个初始化的值不需要每个实例一份,而是整个类只有一份;

2饿汉模式;创建类的时候就定义好成员变量的实例的值;

#include <iostream>
#include <memory>
using namespace std;

class MyClass
{
private:
    MyClass() {
        printf("construct .........");
    };
    
private:
    static MyClass *obj;

public:
    ~MyClass() {};
    static MyClass* getinstance()
    {    
        printf("get instance----------");
        return obj;
    }

};

MyClass * MyClass::obj = new MyClass();
int main()
{

int main()
{
    void* obj = MyClass::getinstance();


    void* obj2 = MyClass::getinstance();

    return 0;
}

一次构造函数的调用,多次获取得到的是同一个实例;先在全局的位置调用了构造,之后每次getinstance得到的是同一个实例

 

posted on 2021-08-04 17:13  邗影  阅读(24)  评论(0编辑  收藏  举报

导航