程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 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為同一個實例
請按任意鍵繼續. . .
釋放實例內存..

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved