zoukankan      html  css  js  c++  java
  • 设计模式之单件模式

    一、概述

    /*
        一般情况下,我们建立的一些类是属于工具性质的,基本不用存储太多的跟自身有关的数据,在这种情况下,每次都去new一个对象,即增加了开销,也使得代码更加臃肿。
        其实,我们只需要一个实例对象就可以。如果采用全局或者静态变量的方式,会影响封装性,难以保证别的代码不会对全局变量造成影响。
        考虑到这些需要,我们将默认的构造函数声明为私有的,这样就不会被外部所new了,甚至可以将析构函数也声明为私有的,这样就只有自己能够删除自己了。
        在Java和C#这样纯的面向对象的语言中,单例模式非常好实现,直接就可以在静态区初始化instance,然后通过getInstance返回,这种就被称为饿汉式单例类。
        也有些写法是在getInstance中new instance然后返回,这种就被称为懒汉式单例类,但这涉及到第一次getInstance的一个判断问题。

        单例模式常常与工厂模式结合使用,因为工厂只需要创建产品实例就可以了,在多线程的环境下也不会造成任何的冲突,因此只需要一个工厂实例就可以了。
     */

    /*
       @单件模式: Singleton
       一) 特点
       1) 最为简单,最为常见,最容易实现,最应该熟悉和掌握。相当于面向过程中的全局变量(对象)
       2) 通过一个static成员变量来记录这一个唯一的对象实例,通过一个static成员接口获得这个唯一的实例。
       3) Singleton不可以被实例化,因此其构造函数应该声明为protected或private

       二)优缺点:
       优点
       1.减少了时间和空间的开销(new实例的开销)。
       2.提高了封装性,使得外部不易改动实例。

       缺点
       1.懒汉式是以时间换空间的方式。
       2.饿汉式是以空间换时间的方式。

     */

    二、类图

    三、代码

    Singleton.h

    #pragma once
    
    #include <iostream>
    using namespace std;
    
    class Singleton
    {
    public:
        static Singleton *GetInstance();
    
    private:
    	static Singleton *m_sInstance;
    
    private:
    	/*
         * @brief Singleton不可以被示例化,所以将构造函数声明为protected或者private。
         */
        Singleton();
    	~Singleton();
    };
    

    Singleton.cpp

    #include "Singleton.h"
    #include "stdio.h"
    
    Singleton::Singleton()
    {
        cout<<__FUNCTION__<<endl;
    
    }
    
    Singleton::~Singleton()
    {
    	cout<<__FUNCTION__<<endl;
    }
    
    Singleton* Singleton::m_sInstance = NULL;
    Singleton *Singleton::GetInstance()
    {
        if ( NULL == m_sInstance )
        {
            m_sInstance = new Singleton();
        }
    
        return m_sInstance;
    }
    

    main.cpp

    #include "Singleton.h"
    
    #include <iostream>
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        Singleton *sgn1 = Singleton::GetInstance();
    	Singleton *sgn2 = Singleton::GetInstance();
    
    	if (sgn1 == sgn2 )
    	{
    		printf("sgn1==sgn2
    ");
    	}
    
        return 0;
    
    }
    

    四、运行结果

    Singleton::Singleton
    sgn1==sgn2
    请按任意键继续. . .

  • 相关阅读:
    Linux 一条命令批量关闭子进程
    Ubuntu18.08+php7 apache2不解析php文件解决方法
    Python ERROR: Cannot uninstall 'PyYAML'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
    python报错 UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)
    Python封装为可执行程序
    PHP-FPM 远程代码执行漏洞(CVE-2019-11043)的简单复现学习
    多事之秋,随便记点东西
    泛微e-cology OA系统某接口存在数据库配置信息泄露漏洞复现
    对vuex的浅解
    vuejs验证码
  • 原文地址:https://www.cnblogs.com/jacklikedogs/p/3807747.html
Copyright © 2011-2022 走看看