创建模式之单例模式

来源:互联网 发布:提醒功能的软件 编辑:程序博客网 时间:2024/05/19 20:39

1、单例模式:

      1.1、概念

       单例模式是一种对象创建型模式,使用单例模式,可以保证每一个类只生成唯一的实例对象,也就是说在整个程序空间中,该类只存在一个实力对象。

       Gof对单例模式的定义是:保证一个类只有一个实例存在,同时提供能对该实例加以访问的全局访问方法。

2、 为什么使用单例模式?

    在应用系统开发中,我们常常有以下需求:

    (1)、在多个线程之间,比如初始化一次Socket资源;比如Severlet环境,共享同一个资源或者操作同一个对象。

    (2)、在整个程序空间使用全局变量,共享资源。

    (3)、大规模系统中,为了性能的考虑,需要节省对象的创建时间等。

                 因为Singleton模式可以保证为一个类只生成唯一的实例对象,所以这些情况,Singleton模式就派上用场了。

3 、实现单例模式的常用步骤

     (1)、构造函数私有化。

   (2)、提供全局的静态方法(全局访问点)。

   (3)、在类中定义一个静态指针,指向本类的静态变量的指针。

4 、饿汉单例模式和懒汉单例模式的实现

        

// 懒汉式单例模式#include<iostream>using namespace std;// 懒汉式单例模式class Singleton{private:Singleton(){cout <<"Singleton  构造函数执行"<< endl;}public:staticSingleton *getInstance(){if (NULL == m_psl){m_psl = new Singleton;}return m_psl;}static void FreeSingleton(){if (NULL!=m_psl){delete m_psl;m_psl = NULL;}}private:static Singleton *m_psl;};Singleton* Singleton::m_psl = NULL;int main(void){Singleton *p1 = Singleton::getInstance();Singleton *p2 = Singleton::getInstance();if (p1==p2){cout << "是同一个对象" << endl;}else{cout << "不是同一个对象" << endl;}Singleton::FreeSingleton();return 0;}// 饿汉式单例模式#include<iostream>using namespace std;class Singleton{private:Singleton(){cout << "Singleton 构造函数执行"<<endl;}public:static Singleton *getInstance(){return m_psl;} static void FreeSingleton(){if (NULL != m_psl){delete m_psl;m_psl = NULL;}}private:static Singleton *m_psl;};// 饿汉单例模式Singleton* Singleton::m_psl = new Singleton;int main(void){Singleton *p1 = Singleton::getInstance();Singleton *p2 = Singleton::getInstance();if (p1 == p2){cout << "是同一个对象" << endl;}else{cout << "不是同一个对象" << endl;}Singleton::FreeSingleton();return 0;}

5 、懒汉式多线程问题

     懒汉式遇上多线程则不是单例模式。

// 03懒汉式多线程问题.cpp : 定义控制台应用程序的入口点。#include "stdafx.h"#include<Windows.h>#include<process.h>#include<iostream>using namespace std;// 懒汉式单例模式class Singleton{private:Singleton(){cout << "Singleton  构造函数执行 begin" << endl;Sleep(1000);cout << "Singleton  构造函数执行 end" << endl;}public:staticSingleton *getInstance(){if (NULL == m_psl){m_count++;m_psl = new Singleton;}return m_psl;}static void FreeSingleton(){if (NULL != m_psl){delete m_psl;m_psl = NULL;}}void printS(){cout << "Singleton printS test" << endl;}private:static Singleton *m_psl;static int *m_count;};// 静态成员变量类外初始化Singleton* Singleton::m_psl = NULL;int *Singleton::m_count = 0;void test(){Singleton *p1 = Singleton::getInstance();Singleton *p2 = Singleton::getInstance();if (p1 == p2){cout << "是同一个对象" << endl;}else{cout << "不是同一个对象" << endl;}Singleton::FreeSingleton();}void MyThreadFunc(void *){//cout << "我是线程体..." << endl;cout << "我是线程体...\n";Singleton::getInstance()->printS();}int main(){  HANDLE hThread[10];for (int i=0;i<3;i++){hThread[i] = (HANDLE)_beginthread(MyThreadFunc,0,NULL);}for (int i=0;i<3;i++){WaitForSingleObject(hThread[i],INFINITE);}cout << "hello" << endl;    return 0;}