第六十二课、单例类模板

一、单例模式(一个类只有一个对象,且单例模式一般不用释放)

1、要控制类的对象数目,必须对外隐藏构造函数

(1)、将构造函数的访问属性设置为private

(2)、定义instance并初始化为NULL

(3)、当需要使用对象时,访问instance的值

A、空值:创建对象,并用instance标记

B、非空值:返回instance标记的对象

#include<iostream>

using namespace std;

class Object
{
    static Object* c_instance;//c_instance用来记录对象
    
    Object();//隐藏构造函数、拷贝构造函数、赋值操作符
    Object(const Object& obj);
    Object& operator = (const Object& obj);
 public:   
    static Object* GetInstance();
    void print();
};

Object* Object::c_instance = NULL;

Object::Object()
{
}

Object* Object::GetInstance()
{
    if(c_instance == NULL)
    {
        c_instance = new Object();
    }
    
    return c_instance;
}

void Object::print()
{
    cout << c_instance << endl;
}

int main()
{
    Object* p1 = Object::GetInstance();
    Object* p2 = Object::GetInstance();
    Object* p3 = Object::GetInstance();
    
    p1->print();
    p2->print();
    p3->print();//最后三个值都一样,说明指向同一个对象
    
    return 0;
}

二、存在的问题及解决方法

1、存在的问题

(1)、必须定义静态成员变量m_instance

(2)、必须定义静态成员函数GetInstance

2、解决方法

(1)、将单例模式相关的代码抽取出来,开发单例类模板

(2)、当需要单例时,直接使用单例类模板

#ifndef _SINGLETON_H_
#define _SINGLETON_H_

template
< typename T >
class Singleton
{
    static T* c_instance;
 public:   
    static T* GetInstance();
};    

template
< typename T >
T* Singleton<T>::c_instance = NULL;

template
< typename T >
T* Singleton<T>::GetInstance()
{
    if(c_instance == NULL)
    {
        c_instance = new T();
    }
    
    return c_instance;
}

#endif
#include<iostream>
#include"Singleton.h"

using namespace std;

class Test
{
    friend class Singleton<Test>;//说明这个类要使用单例模式
    Test(){};//记得定义构造函数
    Test(const Test& obj);
    Test& operator = (const Test& obj);
public:
    void print()
    {
        cout << "this = " << this << endl;
    }    
    
};

int main()
{
    Test* p1 = Singleton<Test>::GetInstance();
    Test* p2 = Singleton<Test>::GetInstance();
    Test* p3 = Singleton<Test>::GetInstance();
    
    p1->print();
    p2->print();
    p3->print();
    
    return 0;
}

三、小结

(1)、单例模式是开发中最常用的设计模式之一

(2)、单例模式的应用使得一个类最多只有一个对象

(3)、可以将单例模式相关的代码抽象成类模板

(4)、需要使用单例模式的类直接使用单例类模板

原文地址:https://www.cnblogs.com/gui-lin/p/6378716.html