C++单例模式详解--设计模式(1)

原创 2016年06月05日 19:38:55


Singleton模式来源:         

       单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。要实现这一点,可以从客户端对其进行实例化开始。因此需要用一种只允许生成对象类的唯一实例的机制,"阻止"所有想要生成对象的访问。使用工厂方法来限制实例化过程。这个方法应该是静态方法(类方法),因为让类的实例去生成另一个唯一实例毫无意义。

Singleton模式作用:

       对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。如在Windows中就只能打开一个任务管理器。如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解,不知道哪一个才是真实的状态。因此有时确保系统中某个对象的唯一性即一个类只能有一个实例非常重要。

      显然单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。

 从具体实现角度来说,就是以下三点:一是单例模式的类只提供私有的构造函数,二是类定义中含有一个该类的静态私有对象,三是该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。

      单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例

Singleton模式示例代码如下:

class CSingleton

{
private:
CSingleton() //构造函数是私有的
{

}
public:
static CSingleton * GetInstance()
{
static CSingleton *m_pInstance;
if(m_pInstance == NULL) //判断是否第一次调用
m_pInstance = new CSingleton();
return m_pInstance;
}
         用户访问唯一实例的方法只有GetInstance()成员函数。如果不通过这个函数,任何创建实例的尝试都将失败,因为类的构造函数是私有的。GetInstance()使用懒惰初始化,也就是说它的返回值是当这个函数首次被访问时被创建的。

         一般Singleton模式通常有三种形式:

第一种形式:懒汉式,也是常用的形式,什么时候用,再创建,不会出现空耗内存的情况。

/*testcode1*/
#include <iostream>
using namestd std;
class Singleton{
public:
    static  Singleton& getInstance(void){
         if(! s_instance)
            s_instance = new Singleton;
          return *s_instance;//不用Singleton,就不创建。
}
private:
    Singleton (void){}
    Singleton(const Singleton&);
    Singleton& operator=(const Singleton&);
    static Singleton* s_instance;
};
Singleton* Singleton::s_instance=NULL;
int main (void){
     Singleton& s1 = Singleton::getInstance ();
     Singleton& s2 = Singleton::getInstance ();
     cout << &s1 << ' '<< &s2 << ' '<< endl;
     return  0;
}

第二种形式:饿汉式,进程一起来,s_instance就存在了,先于main函数构造。

#include <iostream>
using namestd std;
class Singleton{
public:
    static  Singleton& getInstance(void){
          return s_instance;
}
private:
    Singleton (void){}
    Singleton(const Singleton&);
    Singleton& operator=(const Singleton&);
    static Singleton s_instance;
};
Singleton Singleton::s_instance;
int main (void){
     Singleton& s1 = Singleton::getInstance ();
     Singleton& s2 = Singleton::getInstance ();
     cout << &s1 << ' '<< &s2 << ' '<< endl;
     return  0;
}

Singleton模式适用场景:

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

Singleton模式优缺点总结:

Singleton模式优点:

1.减少了时间和空间的开销(new实例的开销)。

2.提高了封装性,使得外部不易改动实例。

 Singleton模式缺点:

1.懒汉式是以时间换空间的方式。

2.饿汉式是以空间换时间的方式。

Singleton模式的使用总结:

         从上可见,单例模式是最简单的一种设计模式,在实际应用中,有一些对象其实只需要一个,比如:线程池,缓存,对话框,处理偏好设置和注册表的对象,日志对象,充当打印机,显卡等设备的驱动程序对象。这些对象只能够拥有一个实例,如果创建出了多个实例,就会导致一些程序的问题。程序的行为异常,资源使用的过量,或者导致不一致的结果。常用来管理共享的资源,比如数据库的连接或者线程池。





 

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

C++ 深入理解 虚继承、多重继承和直接继承

本文从5段代码实例出发,通过类中类的普通继承,类的虚继承,类的多重继承,多个虚函数类的普通继承、虚继承与多重继承,几个交叉概念,详细的阐释了继承、虚函数与虚继承的基本概念,深入剖析了继承于虚继承的区别...

进程和线程的区别与联系

在许多经典的操作系统教科书中,总是把进程定义为程序的执行实例,它并不执行什么, 只是维护应用程序所需的各种资源,而线程则是真正的执行实体。 为了让进程完成一定的工作,进程必须至少包含...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

C++虚函数浅析

C++虚函数浅析:           C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父...

C++封装、继承、多态

C++封装继承多态总结 面向对象的三个基本特征 面向对象的三个基本特征是:封装、继承、多态。其中,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代...

C++继承(一) 常用的继承方式

继承的一些基本知识

标准C++四个类型转换详解

C++中的类型转换分为两种: 1.      隐式类型转换(而对于隐式变换,就是标准的转换,在很多时候,不经意间就发生了,比如int类型和float类型相加时,int类型就会被隐式的转换位float类...

C++精进篇(九)之―继承及经典示例

继承是C++的重要属性:         在C++中有:         公有继承(public)、私有继承(private)、保护继承(protected)是常用的三种继承方式。 1. 公有继承(p...

孤儿进程

父进程运行结束,但子进程还在运行(未运行结束)的子进程就称为孤儿进程(Orphan Process)。孤儿进程最终会被 init 进程(进程号为 1 )所收养,并由 init 进程对它们完成状态收集...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)