正在加载……
专注、离线、切勿分心
单例设计模式(singleton)
内存中只能有一份对象
//单例设计模式:类在内存中只能有1个实例
//实现步骤:
1. 将构造函数私有化。
2. 在类中定义一个静态的指针对象(可为私有,可为公有),并在类外初始化为空
3. 定义一个返回值为类指针的静态成员函数,如果2中的指针对象为空,则初始化对象,以后再有对象调用该静态成员函数的时候,不再初始化对象,而是直接返回对象,保证类在内存中只有一个实例。


//要求: 内存中一个类只能产生一个对象
//1. 该对象不能是栈对象, 全局对象   ;全局变量会破坏“封装”特性,还有对象空间程序运行期间一直存在
//2. 将构造函数放入private区域,才能满足第一步
//3. 在public区域提供一个静态成员函数,通过就这个函数实现最多只有一个对象实例
//4. 提供一个static数据成员,释放资源
#include <iostream>
#include<stdio.h>
using namespace std;
class Singleton
{
        private:
                Singleton()       //声明为私有,防止类外调用
                {
                        cout<<"Singleton()"<<endl;
                }
                ~Singleton()
                {
                        cout<<"~Singleton()"<<endl;
                }
                static Singleton * _pInstance;
        public:
                static Singleton * getInstance()       //保证类只有一个实例
                {
                        if(_pInstance==NULL)
                        {
                                _pInstance = new Singleton;
                        }
                        return _pInstance;

                }
                static void destroy()
                {       
                        cout<<"destroy()"<<endl;
                        delete _pInstance;    //因为是静态的,一次delete就全部删除了
                        //delete p1;
                }
};

Singleton * Singleton::_pInstance = NULL;
int main()
{
        Singleton * p1 = Singleton::getInstance();
//对象才能调用成员函数,所以getInstance()必须为static
        Singleton * p2 = Singleton::getInstance();
        Singleton * p3 = Singleton::getInstance();
        printf("p1=%p\n",p1);
        printf("p2=%p\n",p2);
        printf("p3=%p\n",p3);
        Singleton::destroy();
        //delete p1;    释放一个还有其他的指针还在
        return 0;

}
//这个单例类有一个bug,就是多次申请虽然内存中只有一个对象,但是却有多个指针保存这个对象的地址,当对象释放的时候,其他指针就变成野指针了;
//改进,static Singleton& getInstance()  
static Singleton& getInstance()
{
    if(_pInstance==NULL)
    {
         _pInstance = new Singleton;
    }
    return *_pInstance;   //返回一个对象引用;
}
Singleton &p1 = Singleton::getInstance();





posted on 2018-04-14 08:50  正在加载……  阅读(202)  评论(0编辑  收藏  举报