zoukankan      html  css  js  c++  java
  • 第六十二课、单例类模板

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

    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)、需要使用单例模式的类直接使用单例类模板

  • 相关阅读:
    UVA-11437 Triangle Fun
    UVA 10491
    CF 223C
    poj 3273
    由异常掉电问题---谈xfs文件系统
    好久没有写博客了,最近一段时间做一下总结吧!
    Json.Net
    div 旋转
    VirtualBox虚拟机网络设置
    windows 2003 安装 MVC 环境 404错误,无法找到该页
  • 原文地址:https://www.cnblogs.com/gui-lin/p/6378716.html
Copyright © 2011-2022 走看看