美文网首页
C++实现单例模式

C++实现单例模式

作者: Jarily | 来源:发表于2018-05-29 19:35 被阅读0次

单例模式

设计模式中最简单,最常用的一种模式,这种模式用来保证某一个类的对象实例在应用中只有一个,即只被创建一次。
例如: 配置文件,日志对象,线程池,缓存等。
这些实例为了保证一致性,在整个应用中只需要被创建一次,例如,如果日志对象被创建多次,那么很可能日志中的内容就不一致,还有就是有时候占用资源过多的一些对象被创建多次会浪费资源,比如线程池等。
所以为了保证对象的单例,出现了单例模式。

步骤

  1. 将构造函数声明为私有
    因为在创建一个对象的时候会去调用类的构造函数来完成对对象内存空间的分配以及成员的初始化,所以如果想限制对象的创建,首先应该禁止外界对象对构造函数的调用,通过这个办法就可以限制对象的创建。
  2. 在类中声明一个私有的静态的类的对象(实例)
    这个实例就是我们需要获得的,唯一的实例。
    之所以是static类型的是因为我们需要通过类直接获得而不通过对象获得,因为我们无法创建一个对象。
    同时从封装的角度,我们下面需要定义一个static类型的接口用来返回这个实例。
  3. 定义一个static类型的public类型的事例获取函数
    可以通过类直接调用这个函数获得类中定义的那个实例

饿汉模式

在类加载的时候已经创建好了类的实例,我们通过使用接口直接获得这个实例

  • 饿汉是在类加载的时候就已经完成了类的实例化,所以在加载的时候会被比较慢,但运行起来比较快,而且是线程安全的。
class Singleton
{
private:
    Singleton() {} //将构造函数定义为私有的,避免直接创建外部对象。
    ~Singleton()
    {
        delete sig;
    }
    static Singleton *sig;  //声明一个私有的静态数据成员sig用来作为为一个实例。
public:
    static Singleton *getInstance()  //声明一个static类型的接口获得实例
    {
        return sig;
    }
};

Singleton* Singleton::sig = new Singleton;  //在类外进行实例的定义和初始化

懒汉模式

懒汉模式在类中只给出实例的声明并未给出定义。所以是当多个线程去竞争的时候是线程不安全的,所以需要使用锁机制

class Singleton2
{
private:
    Singleton2() {}
    static Singleton2 *sig;   //只给出声明
public:
    static Singleton2* getInstance();
};

Singleton2* Singleton2::getInstance()
{
    if (sig == NULL)
    {
        sig = new Singleton2;
    }
    return sig;
}
Singleton2* Singleton2::sig;   //不初始化,和饿汉模式的区别。

线程安全的懒汉模式

class Singleton
{
private:
    Singleton() {} //将构造函数定义为私有的,避免直接创建外部对象。
    static Singleton *sig;  //声明一个私有的静态数据成员sig用来作为为一个实例。
public:
    static Singleton *getInstance()  //声明一个static类型的接口获得实例
    {
        if (sig == NULL)//双重检测锁
        {
            lock();
            if (sig == NULL)
            {
                sig = new Singleton;
            }
            unlock();
        }
        return sig;
    }
};
Singleton* Singleton::sig;// = new Singleton;  //在类外进行实例的定义和初始化

相关文章

  • 单例模式

    单例模式及C++实现代码单例模式4种实现详解 c++11改进我们的模式之改进单例模式 单例模式(Singleton...

  • 学而时习之单例模式

    本文主要说明单例模式的概念,应用,以及C++实现。 I、上帝视角看单例模式 1.1 单例模式特点 单例模式需要满足...

  • Singleton 单例模式

    搬运自大神博客单例模式(Singleton)及其C++实现 单例模式,在GOF的《设计模式:可复用面向对象软件的基...

  • C++ 单例模式

    本文介绍C++单例模式的集中实现方式,以及利弊 局部静态变量方式 上述代码通过局部静态成员single实现单例类,...

  • Android设计模式总结

    单例模式:饿汉单例模式://饿汉单例模式 懒汉单例模式: Double CheckLock(DCL)实现单例 Bu...

  • python面试题-2018.1.30

    问题:如何实现单例模式? 通过new方法来实现单例模式。 变体: 通过装饰器来实现单例模式 通过元类来创建单例模式...

  • 单例模式

    一、实现单例模式 或者 二、透明的单例模式 三、用代理实现单例模式 四、JavaScript中的单例模式 在Jav...

  • 单例模式和GCD单例实现

    1、传统单例模式2、GCD单例模式3、用宏实现GCD单例模式4、用宏实现GCD单例模式,名称随类名变化而变化 单例...

  • kotlin实现单例模式

    1.懒汉式实现单例模式 2.线程安全懒汉式实现单例模式 3.双重校验懒汉式实现单例模式 4.静态内部类方式实现单例模式

  • 单例模式之枚举类enum

    通过枚举实现单例模式 枚举类实现单例模式的优点 对于饿汉式单例模式和懒汉式单例模式了解的同学,使用以上两种单例模式...

网友评论

      本文标题:C++实现单例模式

      本文链接:https://www.haomeiwen.com/subject/vroajftx.html