基础工具-单件模式

作为C++设计模式中的单件模式归属于创建型模式之一,在软件设计过程中“出场“的机会还是很多,以下源码作为自己学习开源库代码时针对单件 模式做的一个总结,方便后期设计过程中的参考和学习。

#ifndef  SINGLETON_HPP_
#define  SINGLETON_HPP_

#include <boost/thread.hpp>

namespace ts
{
    /**
     *@breif
     *@note base
     */
    class CLocalStaticInstantiation
    {
    protected:
        template <class T>
        static void create(T*& ptr)
        {
            static T instance;  // 静态局部变量
            ptr = &instance;
        }
    };

    /**
     *@breif
     *@note Helper class
     */
    template <class T>
    class CStaticInstantiationHelpler
    {
        // friend class
        friend class CStaticInstantiation;

        // holder
        static T instance;
    };

    template <class T>
    T CStaticInstantiationHelpler<T>::instance;  // 静态全局变量[这是一个技巧,否则单个对象无法随时初始化]

    /**
     *@breif
     *@note support the static
     */
    class CStaticInstantiation
    {
    protected:
        template <class T>
        static void create(T*& ptr)
        {
            ptr = &CStaticInstantiationHelpler<T>::instance;
        }
    };

    template <class T>
    class CDestroyer
    {
        T *doomed;
    public:
        CDestroyer(T* q):doomed(q)
        {}

        ~CDestroyer();
    };

    template <class T>
    CDestroyer<T>::~CDestroyer()
    {
        try
        {
            if (doomed)
            {
                delete doomed;  // 在这里主要支持heap对象的反初始化
                std::cout << "delete [ " << doomed <<  " ]" << std::endl;
            }
        }
        catch (...){}
        doomed = 0;
    }

    /**
     *@breif
     *@note support the dynamic alloctor
     */
    class CLazyInstantiation
    {
    protected:
        template <class T>
        static void create(T*& ptr)
        {
            ptr = new T;  // 支持运行时分配
            static CDestroyer<T> destroyer(ptr);  // 由static去进行删除
        }
    };

    template <class T, class InstantiationPolicy=CLazyInstantiation>
    class CSingleton : private InstantiationPolicy
    {
    public:
        static T* instance();
    };

    template <class T, class InstantiationPolicy>
    T* CSingleton<T, InstantiationPolicy>::instance()
    {
        static T* ptr = 0;
        static boost::mutex m;
        if ( !ptr )
        {
            boost::mutex::scoped_lock lock(m);  // 支持多线程访问
            if ( !ptr )  // 根据设计模式的设计思想来设计两次检查指针
            {
                InstantiationPolicy::create(ptr);
            }
        }

        return const_cast<T*>(ptr);
    }

}

#endif // SINGLETON_HPP_
时间: 2024-10-16 09:59:29

基础工具-单件模式的相关文章

单件模式详解:懒汉式与饿汉式

class Instance{} //懒汉式 class LSingle{ private static  Instance _instance = null; private LSingle(){} public static Instance getInstance(){ if(_instance==null){ synchronized(LSingle.class){ _instance = new Instance(); } } return _instance; } } //饿汉式 c

设计模式之单件模式

一.概述 /*    一般情况下,我们建立的一些类是属于工具性质的,基本不用存储太多的跟自身有关的数据,在这种情况下,每次都去new一个对象,即增加了开销,也使得代码更加臃肿.    其实,我们只需要一个实例对象就可以.如果采用全局或者静态变量的方式,会影响封装性,难以保证别的代码不会对全局变量造成影响.    考虑到这些需要,我们将默认的构造函数声明为私有的,这样就不会被外部所new了,甚至可以将析构函数也声明为私有的,这样就只有自己能够删除自己了.    在Java和C#这样纯的面向对象的语

说说设计模式~单件模式(Singleton)

单件模式(Singleton)要求一个类有且仅有一个实例,并且提供了一个全局的访问点. 从概念上来研究一下它的实现,不考虑线程安全 1 public sealed class Singlton 2 { 3 static Singlton instance = null; 4 private Singlton() { } 6 7 public static Singlton Instance 8 { 9 get 10 { 11 if (instance == null) 12 { 13 insta

Java设计模式——线程安全的单件模式

单件模式,也称单例模式,用以创建独一无二的.只能有一个实例的对象. 单件模式的类图是所有模式的类图中最简单的--只有一个类.尽管从类设计的视角来看单件模式很简单,但是实现上还是会遇到一些问题,本文着重对这一点来进行分析解决. 最简单的单件模式的实现,代码如下: 1 /** 2 * Created by McBye King on 2016/10/23. 3 */ 4 public class Singleton { 5 private static Singleton singleton; 6

设计模式(5)--单件模式

同步一个方法可能造成程序执行效率下降100倍. 静态初始化的控制权是在Java手上 一个类,一个责任 原则. ( 类应该做一件事,而且只做一件事)  但单件做了两件事, 一是 管理自己的实例(并提供全局访问变量) 二是在应用程序中担任角色, (1). 私有构造器.不提供对外访问   (2). 静态方法对外提供类本身实例.    (3)  . 只有一个实例 单例模式:  ( 管理共享资源 如数据库连接,或者线程池)  MVC  DAO Service 层 延迟实例化(懒汉式) 有线程安全问题  -

【C#设计模式】01.你真的知道线程安全的“单件模式”吗?

概述: 单件模式的类图可以说是所有模式的类图中最简单的,事实上,它的类图上只有一个类. 尽管从设计的视角来说它很简单,但是实现上还是会遇到相当多的波折. 一.职责: 1.保证一个类有且仅有一个实例 2.且提供一个全局访问点 二.代码中需要用到的地方 线程池(Thread Pool)/缓存(cache)/对话框/处理偏好设置和注册表的对象/日志对象/充当打印机/显卡等设备的驱动程序的对象. 三.生活中用到的地方 1.考勤记录仪可以有多台,但是时钟必须只有一个,所有的考勤记录必须根据这个时钟来生成打

让开发效率爆表的Guava ---- 基础工具篇

使用现成的库的原因, 既能减少自己开发所带来的bug, 同时又大大提高了开发效率, 当然这也是Java语言流行的一个原因----拥有海量的开源包. 本篇从Guava基础工具入手开始介绍这个广泛使用的库: package com.wenniuwuren.guava; import java.io.UnsupportedEncodingException; import java.util.Date; import java.util.HashMap; import com.google.commo

设计模式(六):Singleton 单件模式 -- 创建型模式

1.定义 当需要控制一个类的实例数量且调用者可以从一个公共的访问点访问时. 2.适用场景 1. 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时. 2. 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时. 3.评价 优点: 1. 对唯一实例的受控访问, 因为Singleton类封装它的唯一实例,所以它可以严格的控制客户怎样以及何时访问它. 2. 缩小名空间,Singleton模式是对全局变量的一种改进.它避免了那些存储唯一实例的全局变量污染名空

设计模式 - 单件模式(singleton pattern) 详解

单件模式(singleton pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/28595349 单件模式(singleton pattern) : 确保一个类只有一个实例, 并提供一个全局访问点. 单价模式包括3个部分: 私有构造器, 静态变量, 静态方法. 具体方法: 1. 标准的单例模式: /** * @time 2014.6.5 */ package singleton; /** * @author