创建模式之单例模式
来源:互联网 发布:提醒功能的软件 编辑:程序博客网 时间: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;}
阅读全文
0 0
- 创建型模式之单例模式
- 创建型模式之单例模式
- 创建型模式之单例模式
- 创建型模式之单例模式
- 创建型模式之单例模式
- 创建型模式之单例模式
- 创建模式之单例模式
- 创建型模式之单例模式
- java 设计模式-创建模式之单例模式
- 设计模式之创建模式----单例模式
- 设计模式之----创建型模式(三)-----单例模式
- java设计模式 -------- 创建模式 之 单例模式
- java设计模式 -------- 创建模式 之 单例模式【转】
- 创建型模式之原型模式和单例模式
- 设计模式 创建型模式之单例模式
- 设计模式之创建型模式---单例模式
- Java设计模式之创建型模式--单例模式
- 设计模式之创建型模式(1)--单例模式
- 20170818
- Splay模板
- 如何用Python写一个贪吃蛇AI
- 【Django 初学】 -- 配置Mysql
- 算法学习之旅,中级篇(2)-–插入排序
- 创建模式之单例模式
- 代码乱搞
- Bootstrap实例1---简介与配置
- cx_F reeze 压缩py项目
- hdu4018
- -----hdu 2612 Find a way
- 二次封装OKHttp网络框架(1)
- Java中HashMap的实现原理
- 提升实时任务时间确定性的三个建议