三、单例模式
1.简介
单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
2.实现方式
我们通过维护一个static的成员变量来记录这个唯一的对象实例(在面向过程中甚至可以直接用一个全局变量做到这一点)。通过提供一个staitc的接口instance 来获得这个唯一的实例。
3.应用场景
在计算机系统中,需要管理的资源包括软件外部资源,譬如每台计算机可以有若干个打印机,但只能有一个Printer Spooler, 以避免两个打印作业同时输出到打印机中。每台计算机可以有若干传真卡,但是只应该有一个软件负责管理传真卡,以避免出现两份传真作业同时传到传真卡中的情况。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。需要管理的资源包括软件内部资源,譬如,大多数的软件都有一个(甚至多个)属性(properties)文件存放系统配置。这样的系统应当由一个对象来管理一个属性文件。需要管理的软件内部资源也包括譬如负责记录网站来访人数的部件,记录软件系统内部事件、出错信息的部件,或是对系统的表现进行检查的部件等。这些资源管理器构件必须只有一个实例,这是其一;它们必须自行初始化,这是其二;允许整个系统访问自己这是其三。因此,它们都满足单例模式的条件,是单例模式的应用。
4.实现
当单例类提供事例的函数被调用时,首先检查这个实例之前是否已经被实例化,如果已经被实例化,则返回该对象实例的引用(或者指针),若是没有实例化则实例化一个新的对象并返回它的引用(new一个新的指针并将它返回)。为了确保这一点我们需要将构造函数声明成为私有的。
实现:
1.简介
单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
2.实现方式
我们通过维护一个static的成员变量来记录这个唯一的对象实例(在面向过程中甚至可以直接用一个全局变量做到这一点)。通过提供一个staitc的接口instance 来获得这个唯一的实例。
3.应用场景
在计算机系统中,需要管理的资源包括软件外部资源,譬如每台计算机可以有若干个打印机,但只能有一个Printer Spooler, 以避免两个打印作业同时输出到打印机中。每台计算机可以有若干传真卡,但是只应该有一个软件负责管理传真卡,以避免出现两份传真作业同时传到传真卡中的情况。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。需要管理的资源包括软件内部资源,譬如,大多数的软件都有一个(甚至多个)属性(properties)文件存放系统配置。这样的系统应当由一个对象来管理一个属性文件。需要管理的软件内部资源也包括譬如负责记录网站来访人数的部件,记录软件系统内部事件、出错信息的部件,或是对系统的表现进行检查的部件等。这些资源管理器构件必须只有一个实例,这是其一;它们必须自行初始化,这是其二;允许整个系统访问自己这是其三。因此,它们都满足单例模式的条件,是单例模式的应用。
4.实现
当单例类提供事例的函数被调用时,首先检查这个实例之前是否已经被实例化,如果已经被实例化,则返回该对象实例的引用(或者指针),若是没有实例化则实例化一个新的对象并返回它的引用(new一个新的指针并将它返回)。为了确保这一点我们需要将构造函数声明成为私有的。
实现:
//Singleton.h
#pragma once
class Singleton
{
private:
Singleton();
static Singleton* m_Instance;
public:
static Singleton* GetInstance();
public:
void DoSomeThing();
};
//Singleton.cpp
#include "StdAfx.h"
#include "Singleton.h"
#include <iostream>
using namespace std;
Singleton* Singleton::m_Instance = NULL;
Singleton::Singleton()
{
}
Singleton* Singleton::GetInstance()
{
if (NULL == m_Instance)
{
m_Instance = new Singleton();
}
return m_Instance;
}
void Singleton::DoSomeThing()
{
cout<<"Print Singleton"<<endl;
}
//main.cpp
#include "stdafx.h"
#include "Singleton.h"
int _tmain(int argc, _TCHAR* argv[])
{
Singleton* pSingleton = Singleton::GetInstance();
pSingleton->DoSomeThing();
while(1);
return 0;
}