【设计模式】C++单例模式的几种写法

单例模式是最简单的设计模式,就让我像玩简单的游戏一样写下去吧。

v1: 简单模式

和这个版本有过一面之缘,但不敢苟同。

class Singleton
{
    private:
    Singleton() {}
    public:
    static Singleton * getIns()
    {
        static Singleton * ins = new Singleton();
        return ins;
    }
};

问题:何时析构不明确;最重要的是调用多次getIns函数会产生多个static Singleton指针,指向每次都调用都new出来的实例。

v2: 一般模式

典型写法

class Singleton
{
    private:
    Singleton() {}
    static Singleton * ins;
    public:
    static Singleton * getIns()
    {
        if(!ins) ins  = new Singleton();
        return ins;
    }
};

static Singleton * Singleton::ins = NULL;

问题:仍然未考虑析构问题;对象可能被复制出多个副本。

Java中由于允许在调用构造函数之前先初始化变量,因此有这样一种写法:

public class Singleton
{
    private Singleton() {}
    public static Singleton ins = new Singleton();
    public static Singleton * getIns()
    {
        return ins;
    }
};

简洁明了,也是蛮OK啦,析构也省了,并且由于初始化这个语句是JVM做的,因此人工的同步也省了(不带这么欺负C++程序员的 = =)。

v2.1 一般模式2

v3: 加强模式

加入私有的复制构造函数以防出现单例对象的副本;加入一个内部静态类,整个程序结束后,静态类随着其他静态变量消亡,此时调用析构函数将ins析构。

class Singleton
{
    private:
    Singleton() {}
    Singleton(const Singleton & s) {}
    Singleton & operator = (const Singleton & s) {}

    static Singleton * ins; 

    public:
    static Singleton * getIns()
    {
        if(!ins) ins  = new Singleton();
        return ins;
    }

    class CGarbo  // 内部类
    {
    public:
        ~CGarbo()
        {
            if(Singleton::ins)
                delete Singleton::ins;
        }
    };
    static CGarbo Garbo;
};
static Singleton * Singleton::ins = NULL;

问题:不是线程安全的。

v4: hard模式

    static Singleton * getIns()
    {
        pthread_mutex_init( &mutex_lock );
        if(!ins) ins  = new Singleton();
        pthread_mutex_destory( &mutex_lock );
        return ins;
    }

问题:不管ins是不是空,都要加锁,代价高

v5: 再接再励模式

当ins不为空时,反正getIns函数不管读写,直接返回就好了,读写锁尽可交给使用者。

    static Singleton * getIns()
    {
        if(!ins)
        {
            pthread_mutex_init( &mutex_lock );
            if(!ins) ins = new Singleton();
            pthread_mutex_destory( &mutex_lock );
        }
        return ins;
    }

自然,getIns加了锁,析构的时候也同样要加锁。继续学习,再接再励!

时间: 2024-10-17 10:28:45

【设计模式】C++单例模式的几种写法的相关文章

Java设计模式之单例模式(七种写法)

Java设计模式之单例模式(七种写法) 第一种,懒汉式,lazy初始化,线程不安全,多线程中无法工作: public class Singleton { private static Singleton instance; private Singleton (){}//私有化构造方法,防止类被实例化 public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } retu

Android设计模式之单例模式的七种写法

一 单例模式介绍及它的使用场景 单例模式是应用最广的模式,也是我最先知道的一种设计模式.在深入了解单例模式之前.每当遇到如:getInstance()这样的创建实例的代码时,我都会把它当做一种单例模式的实现. 事实上常常使用的图片载入框架ImageLoader的实例创建就是使用了单例模式.由于这个ImageLoader中含有线程池.缓存系统.网络请求,非常消耗资源,不应该创建多个对象,这时候就须要用到单例模式. ImageLoader的创建代码例如以下: ImageLoader.getInsta

设计模式之单例模式的几种写法——java

对于设计模式的使用场景和好处,之前有介绍一篇,今天主要是单例模式的编写方式,直接看代码吧 单例模式之饿汉模式,不会懒加载.线程安全 /** * @Author wangtao * @Description 单例模式之饿汉模式,不会懒加载.线程安全 * @Date 2019-5-22 12:32 * @优点 线程安全,简单易实现 * @缺点 在进行类加载的时候就创建好实例,会占用内存 **/ class SingletonHungry{ //私有构造函数 private SingletonHung

单例模式的几种写法的差异

设计模式:单例模式的几种写法的差异 1.单例模式的概念 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建.这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象. 注意: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 2.单例模式

单例模式的八种写法比较

单例模式是最常用到的设计模式之一,熟悉设计模式的朋友对单例模式都不会陌生.一般介绍单例模式的书籍都会提到 饿汉式 和 懒汉式 这两种实现方式.但是除了这两种方式,本文还会介绍其他几种实现单例的方式,让我们来一起看看吧. 简介 单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在. 许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为.比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象

单例模式的 几种写法

1 首先要知道,什么叫做单例模式. 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例.即一个类只有一个对象实例 2 单例模式简介 单例模式是设计模式中最简单的形式之一.这一模式的目的是使得类的一个对象成为系统中的唯一实例.要实现这一点,可以从客户端对其进行实例化开始.因此需要用一种只允许生成对象类的唯一实例的机制,"阻止"所有想要生成对象的访问.使用工厂方法来限制实例化过程.这个方法应该是静态方法(类方法),因

面试中单例模式有几种写法?

"你知道茴香豆的'茴'字有几种写法吗?" 纠结单例模式有几种写法有用吗?有点用,面试中经常选择其中一种或几种写法作为话头,考查设计模式和coding style的同时,还很容易扩展到其他问题.这里讲解几种猴子常用的写法,但切忌生搬硬套,去记"茴香豆的写法".编程最大的乐趣在于"know everything, control everything".猴子 JDK版本:oracle java 1.8.0_102 大体可分为4类,下面分别介绍他们的基

C# 单例模式的五种写法

C# 单例模式的五种写法及优劣分析,见下文: [单例模式及常见写法](http://blog.csdn.net/jiankunking/article/details/50867050)

单例模式的五种写法

首先来明确一个问题,那就是在某些情况下,有些对象,我们只需要一个就可以了,比如,一台计算机上可以连好几个打印机,但是这个计算机上的打印程序只能有一个,这里就可以通过单例模式来避免两个打印作业同时输出到打印机中,即在整个的打印过程中我只有一个打印程序的实例. 简单说来,单例模式(也叫单件模式)的作用就是保证在整个应用程序的生命周期中, 任何一个时刻,单例类的实例都只存在一个(当然也可以不存在). package singleton; /** * @author lei * 单例模式的五种写法: *

【JAVA学习】单例模式的七种写法

尊重版权:http://cantellow.iteye.com/blog/838473 第一种(懒汉,线程不安全): Java代码   public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } retur