设计模式之(Singleton)模式的几种实现

第一种:低效率实现

这种实现方法,优点是实现简单,缺点是在多线程频繁访问下效率比较低,经常出现锁竞争。适应于不需要频繁访问实例的情况下。

class Singleton
{
public:
    static Singleton* GetInstance()
    {
        AutoLock lock(mutex);
        if (!m_instance)
            m_instance = new Singleton;

        return m_instance;
    }

private:
    Singleton(){};
    Singleton(const Singleton &);
    Singleton & operator =(const Singleton &);

    static Singleton *m_instance;
    static Mutex m_mutex;
}

第二种:两次检查实例指针

这种实现方法相对与第一种效率要高,只要未实例化的情况下进行加锁,但是代码看起来不够简洁,需要两次检查实例指针是否为空。适用于需要频繁获取实例的情况下。

class Singleton
{
public:
    static Singleton* GetInstance()
    {

        if (!m_instance)
        {
            AutoLock lock(mutex);
            if (!m_instance)
                m_instance = new Singleton;
        }
        return m_instance;
    }

private:
    Singleton(){};
    Singleton(const Singleton &);
    Singleton & operator =(const Singleton &);

    static Singleton *m_instance;
    static Mutex m_mutex;
}
Mutex Singleton::m_mutex;
Singleton* Singleton::m_instance = NULL;

第三种:程序启动时即初始化

这种实现方法,相对于前面两种都要简单,缺点是程序一启动便在堆上分配实例,不管有没有客户调用。适用于程序中确定肯定会使用到该实例的情况。

class Singleton
{
public:
    static Singleton* GetInstance()
    {
        return m_instance;
    }

private:
    Singleton(){};
    Singleton(const Singleton &);
    Singleton & operator = (const Singleton &);

    static Singleton *m_instance;
    static Mutex m_mutex;
}
Mutex Singleton::m_mutex;
Singleton* Singleton::m_instance = new Singleton;

 

第四种:线程一次性初始化

按陈硕提出的使用Linux下phtread_once线程函数实现,该线程函数的回调在程序的生命周期只会执行一次,利用该线程函数的回调实现初始化,比上面提到的任何一种方法都要高效,而且代码简洁。缺点是不能跨平台。

class Singleton
{
public:
    static Singleton* GetInstance()
    {
        phtread_once(&ponce, &Singleton::Init);
        return m_instance;
    }

private:
    void Singleton():m_instance(NULL){};
    static void Init()
    {
        m_instance = new Singleton;
    }

    static Singleton *m_instance;
    static pthread_once_t ponce;
}

Singleton* Singleton::m_instance = NULL;
pthread_once_t Singleton::ponce;

时间: 2024-10-22 04:27:28

设计模式之(Singleton)模式的几种实现的相关文章

跟刺猬哥一起学习设计模式【Singleton模式】

设计模式的分类 从目的来看: 创建型模式:负责对象创建 结构性模式:处理类与对象间的组合 行为型模式:类与对象交互中的职责分配 从范围来看: 类模式处理类与子类的静态关系 对象模式处理对象间的动态关系 动机 在软件系统中,经常有这样的一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性以及良好的效率. 如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例呢?其实这应该是类设计者的责任,而不是使用者的责任. 意图 保证一个类仅有一个实例,并提供一个该实例的全局访问点. 

菜鸟学设计模式系列笔记之单例设计模式(Singleton模式)

特殊的类: (1)类和它的实例间一般是一对多的关系.对大多数的类而言,都可以创建多个实例. 在需要这些实例时创建它们,在这些实例不再有用时删除它们.这些实例的来去伴随着内存的分配和归还. (2)但是有一些类,应该只有一个实例. 这个实例似乎应该在程序启动时被创建出来,且只有在程序结束时才被删除. Intent : 一个类仅有一个实例,自行实例化并向整个系统提供一个访问它的全局访问点 Motivation : 对于一些类来说,只有一个实例是很重要的 Singleton (1)定义一个Instanc

设计模式之Singleton模式

作用:只生成一个实例 public class Singleton { private static Singleton singleton = new Singleton(); private Singleton() { System.out.println("get a new object"); } public static Singleton getInstance() { return singleton; } } 要点:类自身的构造函数为private(防止自己生成实例)

设计模式之Singleton模式(笔记)

单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 定义一个Singleton单例类 public class Singleton { public Singleton(){ } //通过静态初始化方法定义一个单例对象 private static Singleton instance=new Singleton(); public static Singleton getInstance(){ return instance; } }

两种用于派生的Singleton模式(以TextureMgr为例)

Singleton,顾名思义,从字面上来理解就是单例模式,这是C++程序中 常用到的一种设计模式,特别是像文件管理器,纹理管理器这种整个软件 中只需要唯一的实例来管理所有资源时,这种模式的价值便得以体现. 下面来介绍两种用于派生管理的Singleton模式: 其中,第一种是Gof版本的Singleton, 其代码如下: //[Singleton_Gof.h] #pragma once template<typename T> class Singleton_Gof { protected: s

设计模式--singleton模式

使用单件模式的意图是保证一个类只有一个实例,并提供一个访问它的全局访问点. 将单件定义为全局或静态对象,然后依赖于自动的初始化,并不能完全实现上述意图.虽然可以提供全局访问点,但这是不够的.原因如下: 1)我们不能保证静态对象只有一个实例会被声明. 2)我们可能没有足够信息在静态初始化时实例化每个单件,单件可能需要在程序运行中稍后被计算出来的值. 3)c++没有定义转换单元上全局对象的构造器的调用顺序.这意味着单件之间不存在依赖关系:如果有,那么错误将是不可避免的. 4)使用全局或静态对象的实现

Java开发中的23种设计模式详解之一:5种创建型模式

一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 其实还有两类:并发型模式和线程池模式.用一个图片来整体描述一下: 二.设计模式的六大原则 1.开闭原则(Open Clo

设计模式之单件模式(Singleton Pattern)

一.单件模式是什么? 单件模式也被称为单例模式,它的作用说白了就是为了确保“该类的实例只有一个” 单件模式经常被用来管理资源敏感的对象,比如:数据库连接对象.注册表对象.线程池对象等等,这种对象如果同时存在多个的话就会造成各种不一致的麻烦(你总不希望发生数据库重复连接的异常吧) 二.如何保证类的实例只有一个? (这个问题看似简单,但如果没有接触过单件模式的话,要自己想出来解决方案还是需要一些天赋的..不信的话,可以试着想想..) 1.类的实例可能只有一个吗?貌似只要知道类名就可以随便new了吧?

二十三种设计模式[20] - 状态模式(State Pattern)

前言 状态模式,对象行为型模式的一种.在<设计模式 - 可复用的面向对象软件>一书中将之描述为" 允许一个对象在其内部状态改变时改变它的行为,使对象看起来似乎修改了它的类 ". 场景 我们都坐过火车,火车可以简单的分为" 开门 "," 关门 "," 运行 "," 停止 "四个状态.火车在这四个状态下分别可以做不同的事情.比如只有在关门时才行运行.只有在停止时才能开门. 我们在开发类似的业务时,往

二十三种设计模式[21] - 策略模式(Strategy Pattern)

前言 策略模式,对象行为型模式的一种.在<设计模式 - 可复用的面向对象软件>一书中将之描述为" 定义一些列的算法,把它们一个个封装起来,并且使它们可相互替换.使得算法可以独立于使用它的客户而变化 ". 也就是说通过策略模式,我们能够将算法与其调用者分离成相对独立的个体,降低维护成本,使代码更加优雅. 场景 就拿数据的搜索来说,可以简单的分为模糊搜索和精确搜索.在开发这个功能时,可能会写出如下代码. public List<string> Search(stri