• Singleton 单例模式


    意图

    保证一个类仅有一个实例,并提供一个访问它的全局访问点。

    动机

    让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建(通过截取创建新对象的请求) ,并且它可以提供一个访问该实例的方法。这就是Singleton模式。

    适用性

    • 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
    • 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。

    结构

    参与者

    定义一个Instance操作,允许客户访问它的唯一实例。Instance是一个类操作(即Smalltalk中的一个类方法和C + +中的一个静态成员函数) 

    协作

    客户只能通过Singleton的Instance操作访问一个Singleton的实例

    实现

    #include <iostream> 
    using namespace std;
    
    class Singleton
    {
    public:
        static Singleton * Instance();
        static void Destroy();
        void sayHello(){ cout << "hello" << endl; }
    protected:
        Singleton();
    private:
        static Singleton *m_pInstance;
    };
    
    Singleton * Singleton::m_pInstance = NULL;
    
    Singleton * Singleton::Instance()
    {
        if (m_pInstance == NULL)
            m_pInstance = new Singleton;
        return m_pInstance;
    }
    
    void Singleton::Destroy()
    {
        delete m_pInstance;
        m_pInstance = NULL;
    }
    
    Singleton::Singleton(){}
    
    int main()
    {
        Singleton::Instance()->sayHello();        //直接调用静态函数
        Singleton *p_s1 = Singleton::Instance();
        Singleton *p_s2 = Singleton::Instance();
        if (p_s2 == p_s1)
            cout << "same" << endl;        //输出same验证确实是单例
        else
            cout << "diff" << endl;
        system("pause");
    }

    要点:注意构造函数是保护性,试图直接实例化Singleton的客户将得到一个编译时的错误信息,这样就保证了仅有一个实例可以被创建

    另外一篇关于Singleton的好文章:

    http://www.cnblogs.com/loveis715/archive/2012/07/18/2598409.html

    http://www.cnblogs.com/liyuan989/p/4264889.html

  • 相关阅读:
    EF6(CodeFirst)+MySql开发遇到的坑
    Entity Framework mvc Code First data migration
    SQL 修改排序规则的问题 sql_latin1_general_cp1_ci_as
    sql 与linq的转换
    Entity Framework的事务提交
    .net Quartz 服务 作业调度
    如何插上U盘 自动复制内容
    SQL学习之--触发器
    原生javascript与jquery 的比较
    原生javascript学习
  • 原文地址:https://www.cnblogs.com/raichen/p/5617632.html
Copyright © 2020-2023  润新知