您的位置:首页 > 其它

设计模式之单件模式

2014-06-25 11:44 253 查看
一、概述

/*
一般情况下,我们建立的一些类是属于工具性质的,基本不用存储太多的跟自身有关的数据,在这种情况下,每次都去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\n");
}

return 0;

}


四、运行结果

Singleton::Singleton
sgn1==sgn2
请按任意键继续. . .
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: