zoukankan      html  css  js  c++  java
  • 单件模式(Singleton)C++实现

    意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

    实用性:1.当类只能有一个实例而且客户可以从一个众所周知的访问点访问它。

        2.当这个唯一的实例应该是通过子类可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。

    效果:   1.只有一个实例,可以严格的控制客户怎样以及何时访问。

        2.缩小名空间,避免了唯一实例的全局变量污染名空间。

        3.可以控制对象的实例个数。

        

     代码示例:这里类是一个人Micla,世界上仅有一个Mical,只能产生一个实例。

    #ifndef _SINGLETON_
    #define _SINGLETON_
    
    class Mical{
    public:
        ~Mical(){}
    
        static Mical* GetMical()
        {
            if(NULL == _mpMical)
            {
                _mpMical = new Mical;
                static Delete Del;
            }
            return _mpMical;
        }
    
    private:
        static Mical* _mpMical;
    
        ////避免了不同情况实例化类对象
        Mical(const Mical& another){}
        Mical& operator = (const Mical& another){} 
        Mical(){}
    
    };
    
    #endif

     实现部分:

    #include <iostream>
    #include "Singleton.h"
    
    using namespace std;
    Mical* Mical::_mpMical = NULL;
    
    int main()
    {
        Mical* pMical = Mical::GetMical();
        delete Mical::GetMical();
        return 0;
    }

    用Mical* pMical = Mical::GetMical();   实现了访问Micla  然后我们可以通过pMical访问Mical的各种属性(假设为:身高,性别等)

    之后通过delete Mical::GetMical();  删除对象。  但这样的删除容易被遗忘,因为new的过程是被封装起来的。

    于是通过内嵌类实现自动delete:

    #ifndef _SINGLETON_
    #define _SINGLETON_
    
    class Mical{
    public:
        ~Mical(){}
    
        static Mical* GetMical()
        {
            if(NULL == _mpMical)
            {
                _mpMical = new Mical;
                static Delete Del;
            }
            return _mpMical;
        }
        
    
    private:
        static Mical* _mpMical;
    
        ////避免了不同情况实例化类对象
        Mical(const Mical& another){}
        Mical& operator = (const Mical& another){} 
        Mical(){}
    
        class Delete{
        public:
            Delete(){}
            ~Delete(){delete _mpMical;}
        };
    };
    
    #endif

    这就实现了Singleton;

    要注意的是  1.封死其他的实例化接口      2.对象删除问题处理

  • 相关阅读:
    前端性能优化
    技术从业者的未来(二)
    微服务架构
    SpringCloud 微服务最佳开发实践
    架构师之路
    SpringBoot开发秘籍
    架构设计方法论
    消息架构的设计难题以及应对之道
    SpringCloud 中如何防止绕过网关请求后端服务?
    微服务架构授权是在网关做还是在微服务做?
  • 原文地址:https://www.cnblogs.com/wrbxdj/p/4172929.html
Copyright © 2011-2022 走看看