单例模式---设计模式

来源:互联网 发布:条码价签打印软件 编辑:程序博客网 时间:2024/06/07 20:48
1.定义:其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。
具体的例子:购物车;系统的日记输出;
2.实现:
(1)实现一:(只适应与单线程的环境)
class Singleton{public:   static Singleton *GetInstance()    {        if(instance==NULL)        {            instance=new Singleton;            return instance;        }        return instance;    }    static void DeleteInstance()    {        if(instance!=NULL)        {            delete instance;            instance=NULL;        }          }private:    Singleton()    {    }    static Singleton *instance;};Singleton *Singleton::instance=NULL;
(2)实现二:在多线程的情况下,就可能创建多个Singleton实例
加上一个同步锁;
class Singleton{public:    static Singleton *GetInstance()    {        Lock();        if(instance==NULL)        {            instance=new Singleton;            return instance;        }        UnLock();        return instance;    }      static void DeleteInstance()    {        if(instance!=NULL)        {            delete instance;            instance=NULL;        }            }private:    Singleton()    {    }    static Singleton *instance;};Singleton *Singleton::instance=NULL;


缺点:每次通过属性Instance得到一个实例,都会试图加上一个同步锁,而加锁的过程又是一个耗时的操作。

(3)实现三:
要实现的操作只是在实例没有创建之前需要进行加锁操作,以保证只有一个线程能够创建实例。
class Singleton{public:    static Singleton *GetInstance()    {        if(instance==NULL)        {            Lock();            if(instance==NULL)            {                                instance=new Singleton;            }            UnLock();        }        return instance;    }    static void DeleteInstance()    {        if(instance==NULL)        {           delete instance;            instance=NULL;        }    }private:    static Singleton *instance;    Singleton()    {           }};Singleton Singleton::instance=NULL;
(4)实现四:
实现像智能指针的行为,自动释放内存空间。
class Singleton{private:    Singleton()    {    }    class Test    {    public:        ~Test()        {           if(instance!=0)            {                cout<<"the descontructor is running"<<endl;                delete instance;                instance=0;            }        }    };    static Test te;    static Singleton *instance;public:    static Singleton *GetInstance()    {        return instance;    }};Singleton *Singleton::instance=new Singleton();Singleton::Test Singleton::te;




0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 学历认证是假的怎么办 怕被公司查学历怎么办 淘宝玩具没有怎么办3c 家庭遭遇小三我该怎么办 老公出轨把小三带回家了怎么办 小三怀孕了怎么办准生证 小三怀孕了起诉怎么办 不知情做了小三怎么办 发现自己被三了怎么办 被扇巴掌脸肿了怎么办 分到上海市金鼎学校怎么办 被列入维稳对象怎么办? 资金涉及诈骗案冻结了怎么办 小米浏览器浏览记录找不到了怎么办 米聊账号封了怎么办 管家婆创业版管理员忘记密码怎么办 手机不记得密码了怎么办 手机不记得开锁密码怎么办 oppo手机不记得密码怎么办 电脑密码不记得了怎么办 vivo手机不记得密码了怎么办 运管把车扣了怎么办 大学通选课挂科怎么办 通识必修课挂了怎么办 我想开3d艺术馆怎么办 档案回原籍报到证怎么办 服刑的人孩子上学怎么办 长沙终身教育网用户名忘记了怎么办 乡下卖服装没生意怎么办 没能力没学历该怎么办 没有学历的我该怎么办 补过的牙掉了怎么办 法院判完被告不给钱怎么办 b证到期未继续教育怎么办 宝宝上幼儿园中午要用尿不湿怎么办 嫁到北京农村怎么办居住证 2020年没脱贫的农民怎么办 2020年农民的土地怎么办 车停在停车场被划怎么办 专升本差两分怎么办 入职需要学士学位证怎么办