• 设计模式——单例模式(Singleton )


    单例(Singleton)模式是所有模式里面最好理解,也是最容掌握的一种模式。

    一、功能
      保证一个类仅有一个实例。

    二、结构图



    三、优缺点
      Singleton模式是做为"全局变量"的替代品出现的。所以它具有全局变量的特点:全局可见、贯穿应用程序的整个生命期,它也具有全局变量不具备的性质:同类型的对象实例只可能有一个。

    四、实现

    class Singleton
    {
    public:
    static Singleton* Instance() ;
    protected:
    Singleton() {}
    //无法调用实例,只能指针化
    private:
    static Singleton *instance ;
    Singleton(
    const Singleton&) ;//禁止复制
    Singleton& operator=(const Singleton&) ;//禁止赋值
    } ;

    Singleton
    * Singleton::instance = 0 ;//初始化
    Singleton
    * Singleton::Instance()
    {
    if( 0 == instance)
    {
    instance
    = new Singleton(); //lazy initialization
    }
    return instance ;
    }

    因为返回的是指针,为防止用户调用delete函数,可把static Singleton *instance;改为在Instance()中定义static Singleton instance。这样显然更安全,同时也具有lazy initialization的特性(即第一次访问时才创建)。

    代码示例

    Singleton* Singleton::Instance()
    {
    static Singleton instance;
    return &instance ;
    }

    当然,上述两种方式只适用于单线程模式,对于多线程来说,依然可能有两个实例。有网友指出“纯C、C++语言是无法安全实现多线程安全的Singleton的”,在《Design Pattern: Singleton 模式》中以Java为例子,给出了多线程下的代码(注意synchronized 关键字

    public class Singleton {
    private static Singleton instance = null;
    private Singleton(){}
    synchronized static public Singleton getInstance() {
    if (instance == null) {
    instance
    = new Singleton();
    }
    return instance;
    }
    }

    (ps虽然引述代码,还是推荐围观下讨论)

    当然,无论怎么样的实现,不可能完美,满足需求就好。

    CSDN上有精彩的讨论,可以去围观。

  • 相关阅读:
    Python 日期格式化 及 schwartzian排序
    好的数据源
    董的博客 hadoop
    hadoop 2.2.0 集群部署 坑
    python 单元测试
    减少前端代码耦合
    jQuery $.ajax传递数组的traditional参数传递必须true
    如何做一个大格局的人
    中国各省市县级 JSON 文件
    用v-for进行table循环
  • 原文地址:https://www.cnblogs.com/westfly/p/2113226.html
Copyright © 2020-2023  润新知