当前位置:编程学习 > C/C++ >>

设计模式笔记之---单例模式

单例模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点。  
UML类图:
                 
实现方法:
1.创建一个指向唯一实例的静态指针,并且是私有的。
2.提供一个公用的接口,已获取这个唯一的实例,如果唯一实例不存在,在接口内部首先将它创建出来。
3.将类的构造函数设置为私有的,保证用户不能通过其它方式创建实例。
4.将类的析构函数设置为私有的,因为类只有一个实例,不能让用户随便删除,这样用户调用delete来释放实例对象时,编译器会报错,指示非法。
单例模式基本代码如下:
[cpp] 
/********************************************************************
filename:   Singleton.h
created:    2012-09-24
author:     firehood
 
purpose:    firehood 学设计模式之---单例模式
*********************************************************************/ 
#include<stdio.h> 
#pragma once 
 
class Singleton 

public: 
    static Singleton* GetInstance(void); 
private: 
    static void Destory(void); 
    Singleton(void); 
    ~Singleton(void); 
    Singleton(const Singleton&); 
    Singleton& operator = (const Singleton&); 
private: 
    static Singleton* pInstance; 
}; 

[cpp] 
/********************************************************************
filename:   Singleton.cpp
created:    2012-09-24
author:     firehood
 
purpose:    firehood 学设计模式之---单例模式
*********************************************************************/ 
#include "Singleton.h" 
#include <iostream> 
using namespace std; 
 
Singleton* Singleton::pInstance = NULL; 
Singleton::Singleton(void) 


 
Singleton::~Singleton(void) 


 
Singleton* Singleton::GetInstance(void) 

    if(pInstance == NULL) 
    { 
        pInstance = new Singleton(); 
        // 注册终止函数(进程退出时调用) 
        atexit(Destory); 
    } 
    return pInstance; 

 
void Singleton::Destory(void) 

    if(pInstance) 
    { 
        cout<< "释放实例内存.."<<endl; 
        delete pInstance; 
        pInstance = NULL; 
    } 

客户端调用代码:
[cpp]
#include "Singleton.h" 
#include <iostream> 
using namespace std; 
 
int main(int argc,char* argv[]) 

    cout<<"*************************************"<<endl; 
    cout<<"firehood 学设计模式之---单例模式"<<endl; 
    cout<<"*************************************"<<endl; 
     
    Singleton* pInstance1 = Singleton::GetInstance(); 
    cout<<"实例1:"<<hex<<pInstance1<<endl; 
 
    Singleton* pInstance2 = Singleton::GetInstance(); 
    cout<<"实例2:"<<hex<<pInstance2<<endl; 
 
    if(pInstance1 == pInstance2) 
    { 
        cout<<"实例1和实例2为同一个实例"<<endl; 
    } 
     
    system("pause"); 
    return 0; 

运行结果:
*************************************
firehood 学设计模式之---单例模式
*************************************
实例1:003A64E8
实例2:003A64E8
实例1和实例2为同一个实例
请按任意键继续. . .
释放实例内存..

补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,