zoukankan      html  css  js  c++  java
  • 设计模式——单例模式(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上有精彩的讨论,可以去围观。

  • 相关阅读:
    常用的站内搜索技术比较
    .NET中读取csv文件内容
    C#编码规范
    处理模型——检测光标是否在模型上
    数据库如何规范命名
    处理顶点——绘制三角形,线和点
    处理模型——根据地形正确倾斜模型
    处理顶点——使用索引移除冗余顶点
    处理顶点——在三角形上添加纹理
    处理模型——通过定义一个自定义的TypeWriter和TypeReader将多个对象存储在Tag属性中
  • 原文地址:https://www.cnblogs.com/westfly/p/2113226.html
Copyright © 2011-2022 走看看