`

Singleton模式简介

阅读更多
1.         Singleton模式简介

Singleton是GOF圣经中最简单的一个模式了,主要用于创建在系统中具有唯一实例又需要到处使用的类,实现起来非常简单。

#include <iostream>

using namespace std;


class my_singleton

{

public:

    static my_singleton *instance();

    void show_my_life();

protected:

    my_singleton();

private:

    static my_singleton *m_instance;

};


my_singleton *my_singleton::m_instance = NULL;


my_singleton *my_singleton::instance()

{

    if (m_instance == NULL)

    {

        m_instance = new my_singleton;

    }


    return m_instance;

}


void my_singleton::show_my_life()

{

cout << "i'm living at " << (void*)this << endl;

}


my_singleton::my_singleton(){}



my_singleton::~my_singleton()

{

    if (m_instance != NULL)

    {

        delete m_instance;

        m_instance = NULL;

    }

}


int main()

{

    my_singleton::instance()->show_my_life();


    return 0;

};

2.         ACE中如何使用Singleton

如上例中,singleton代码非常简单,也很成熟,但是如果在一个系统中有很多地方都需要使用singleton模式,则需要写相当多的类似重复代码,枯燥且低效,如果碰巧使用了ACE,那么使用ACE封装的singleton,则可以更加简单:

class normal_test

{

    friend class ACE_Singleton<normal_test, ACE_Null_Mutex>;

public:

    void show_my_life();

private:

    normal_test();

};

normal_test::normal_test(){}

typedef ACE_Singleton<normal_test, ACE_Null_Mutex> NORMAL_TEST;


void normal_test::show_my_life()

{

    cout << "i'm living at " << (void*)this << endl;

}


int ACE_TMAIN(int argc, ACE_TCHAR *argv[])

{

    my_singleton::instance()->show_my_life();


    NORMAL_TEST::instance()->show_my_life();


    return 0;

};


如上所示,获得了以下优点:

1.    代码减少了一半还多,变得更加简洁、清晰,

2.    使用了double-check技术,免费的获得了线程安全。

3.    没有使用继承、虚函数,性能、效率不会受影响。


3.         ACE的singleton是如何实现的?

以下代码节选自ACE的源代码,为清晰起见,去除了一些无关的宏开关

a)         以下是ACE_Singleton的定义:

template <class TYPE, class ACE_LOCK>

class ACE_Singleton : public ACE_Cleanup

{

public:

  /// Global access point to the Singleton.

  static TYPE *instance (void);


  /// Cleanup method, used by <ace_cleanup_destroyer> to destroy the

  /// ACE_Singleton.

  virtual void cleanup (void *param = 0);


  /// Dump the state of the object.

  static void dump (void);


protected:

  /// Default constructor.

  ACE_Singleton (void);


  /// Contained instance.

  TYPE instance_;


  /// Pointer to the Singleton (ACE_Cleanup) instance.

  static ACE_Singleton<TYPE, ACE_LOCK> *singleton_;


  /// Get pointer to the Singleton instance.

  static ACE_Singleton<TYPE, ACE_LOCK> *&instance_i (void);

};


b)      看一下instance的实现:

template <class TYPE, class ACE_LOCK> TYPE *

ACE_Singleton<TYPE, ACE_LOCK>::instance (void)

{

  ACE_TRACE ("ACE_Singleton<TYPE, ACE_LOCK>::instance");


  ACE_Singleton<TYPE, ACE_LOCK> *&singleton =

    ACE_Singleton<TYPE, ACE_LOCK>::instance_i ();


  // Perform the Double-Check pattern...

  if (singleton == 0)

    {

          static ACE_LOCK *lock = 0;

          if (ACE_Object_Manager::get_singleton_lock (lock) != 0)

            // Failed to acquire the lock!

            return 0;


          ACE_GUARD_RETURN (ACE_LOCK, ace_mon, *lock, 0);


          if (singleton == 0)

            {

              ACE_NEW_RETURN (singleton, (ACE_Singleton<TYPE, ACE_LOCK>), 0);


              // Register for destruction with ACE_Object_Manager.

              ACE_Object_Manager::at_exit (singleton);

            }

    }


  return &singleton->instance_;

}


说明:double-check技术主要是解决线程安全问题,避免在初始化时多线程重入,导致instance被实例化两次。


c)      再看一下instance_i的实现:

template <class TYPE, class ACE_LOCK> ACE_Singleton<TYPE, ACE_LOCK> *&

ACE_Singleton<TYPE, ACE_LOCK>::instance_i (void)

{

  static ACE_Singleton<TYPE, ACE_LOCK> *singleton_ = 0;


  return singleton_;

}


4.         题外话:

ACE_Singleton较好的封装了Singleton模式,对于现代应用系统,一般而言会有相当多的地方需要使用Singleton模式,如线程池、内存池、数据连接池等,通过ACE_Singleton类,可以达到简化代码的目的,同时解决GOF圣经中未提的线程安全的问题。后续我会继续就ACE中的使用的设计模式提出来与大家进行探讨、学习。

分享到:
评论

相关推荐

    C++完美实现Singleton模式

    #### 一、Singleton模式简介 Singleton模式是一种常用的软件设计模式,旨在确保一个类只有一个实例,并提供一个全局访问点。这种模式在系统中经常被用于控制对共享资源(如数据库连接、日志对象等)的访问。正确地...

    最简单的设计模式学习Singleton模式

    #### 一、Singleton模式简介 Singleton(单例)模式是一种常用的软件设计模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在许多场合下非常有用,例如管理共享资源、创建线程池、数据库...

    C++ 实现的singleton 模式

    **C++实现的Singleton模式详解** Singleton模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,例如管理共享资源,如数据库连接池,或者确保某个...

    Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)

    这里我们将深入探讨三种常见的Java设计模式:单例(Singleton)、工厂方法(Factory Method)和抽象工厂(Abstract Factory)。 **单例模式(Singleton)** 单例模式确保一个类只有一个实例,并提供一个全局访问点...

    (创建型模式)Singleton模式

    Singleton模式是设计模式中的一种创建型模式,它在软件工程中扮演着重要的角色。这个模式的主要目的是确保一个类只有一个实例,并提供一个全局访问点来获取这个唯一的实例。Singleton模式的应用场景通常涉及到系统...

    Java的Singleton模式代码(免资源分)

    ### Java的Singleton模式详解 #### 一、Singleton模式概述 Singleton模式是一种常用的设计模式,在Java中主要用于确保一个类只有一个实例,并提供一个全局访问点。这种模式对于管理共享资源(如数据库连接池、...

    设计模式 创建型模式 Singleton模式(单键)

    Singleton模式: 确保一个类只有唯一的一个实例。 Singleton主要用于对象的创建,这意味着,如果某个类采用了Singleton模式,则在这个类被创建后,它将有且仅有一个实例可供访问。很多时候我们都会需要Singleton...

    Qt qml Singleton 单例模式

    综上所述,Qt Qml的Singleton模式为全局共享对象提供了方便,使得在Qml环境中管理和访问同一对象变得简单。通过C++和Qml的有效结合,我们可以构建出高效且易于维护的应用程序。了解和熟练运用Singleton模式,对于...

    C#设计模式之Singleton模式

    《C#设计模式之Singleton模式详解》 Singleton模式是软件设计模式中的一种基础模式,它在众多设计模式中占有重要地位,尤其在C#编程中经常被应用。Singleton模式的主要目的是确保一个类只有一个实例,并提供一个...

    Singleton模式源程序

    Singleton模式是一种设计模式,它是创建型模式的一种,用于控制类的实例化过程,确保一个类在整个应用程序中只有一个实例存在。这种模式在系统中需要频繁创建和销毁对象,且对象需要共享资源时非常有用,比如配置...

    Java线程安全的Singleton模式:深入分析与实现

    在Java编程中,Singleton模式是一种常用的设计模式,它确保一个类只有一个实例,并提供一个全局访问点。线程安全的Singleton模式对于多线程环境尤为重要,因为它可以防止多个线程同时创建多个实例。本文将详细介绍...

    singleton设计模式java实现及对比

    在Java中,Singleton模式的实现有多种方式,每种方式都有其优缺点,我们将详细探讨这些实现方法并进行对比。 ### 1. 饿汉式(Static Final Field) 这是最简单的Singleton实现方式,通过静态初始化器在类加载时就...

    java Singleton单例模式

    接下来,我们将深入探讨Java Singleton模式的实现方式、优缺点以及使用场景。 一、Singleton模式的实现 1. 饿汉式(静态常量) ```java public class Singleton { private static final Singleton INSTANCE = ...

    Singleton模式

    Singleton模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。这个模式在许多场景下非常有用,比如配置管理、日志服务、线程池等,需要确保全系统内只有一个对象来处理特定任务的情况...

    深入浅出单例Singleton模式

    【深入浅出单例Singleton模式】 单例模式是一种在软件设计中常见的设计模式,它的核心目标是确保一个类只有一个实例,并提供一个全局访问点。在Java等面向对象编程语言中,单例模式常用于控制资源的共享,如全局...

    C#面向对象设计模式纵横谈-1.Singleton 单件(创建型模式)

    Singleton模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个唯一的实例。这种模式在需要控制资源的唯一性或者全局访问点时非常有用,比如数据库连接、线程池或者缓存管理等。 ...

    单例模式Singleton(java源码)

    Singleton模式包含的角色只有一个,就是Singleton。Singleton拥有一个私有构造函数,确保用户无法通过new直接实例化它。除此之外,该模式中包含一个静态私有成员变量instance与静态公有方法Instance()。Instance()...

Global site tag (gtag.js) - Google Analytics