23 DesignPatterns学习笔记:C++语言实现 --- 1.3 Singletion
2016-07-21
(www.cnblogs.com/icmzn)
模式理解
1. Singleton 模式定义:
该模式在设计中非常有用。
挡在开发中遇到一些对象实例是必须在系统内是唯一的的时候,则需要使用单例模式。一般不推荐使用全局对象。
2. Singleton模式优点:
(1)Singletion模式的构造函数声明为protected,则不允许通过new进行实例化;可以设置为private,更为严格。
(2)Singletion 模式与 factory method 模式配合使用,一般情况下,工厂方法模式在系统中一般只需要一个工厂对象即可,随意可以
工厂对象实现为Singletion模式,则比较简单便捷使用。或者使用静态工厂方法,也比较简单;
(3)系统中某些对象创建、销毁过程开销很大,使用单例模式优势明显。可以在系统启动的时候直接产生单例模式创建。
然后永久驻留在内存的方式来解决。
(4)单利模式能够处理一下全局访问点控制情况;
3. Singleton模式使用场景:
(1)对系统进行全局的控制环境的情形;
(2)创建一个对象消耗资源很多,如处理IO、数据库等资源,可以“有上限多例模式”非常有优势。
(3)需要定义大量静态常量、静态方法的工具类(环境),采用单利,变为创建非静态的成员使用,也可以就默认使用static情况。
4. Singleton 讨论注意问题:
(1)Singleton 存在并发隐患,在单利函数处,需要添加并发控制;
因为一些对象的构造可能开销很大,所有存在一个时间区间在高并发量的情况下,出现程序异常。
推荐采用饿汉模式创建单例:
static CXXSingletion *pSingletion = new CXXSingletion();
(2) 虽然类的构造函数声明为Protect或者private情况,则在不允许在类定义之外创建对象,但是在Java中可以通过类的特殊复制方法创建。
5. Singletion模式的扩展
(1)有上限的多例模式
可以设计在系统启动时候,创建某些开销很大对象的多例模式,方便修正单例模式在性能响应的不足。
程序实现(C++)
pattern.h
1 #pragma once 2 #ifndef _CXXSIINGLETION_H_ 3 #define _CXXSINGLETION_H_ 4 class CXXSingletion 5 { 6 protected: 7 CXXSingletion(); 8 public: 9 ~CXXSingletion(); 10 static CXXSingletion* getInstance(); 11 private: 12 static CXXSingletion* m_pInstance; 13 }; 14 15 #endif
pattern.cpp
1 #include "XXSingletion.h" 2 #include <iostream> 3 4 5 //静态成员初始化,在类的声明文件声明,在类的定义文件初始化,要带上类型 6 CXXSingletion* CXXSingletion::m_pInstance = nullptr; 7 8 CXXSingletion::CXXSingletion() 9 { 10 } 11 12 13 CXXSingletion::~CXXSingletion() 14 { 15 if (m_pInstance) 16 delete m_pInstance; 17 m_pInstance = nullptr; 18 } 19 //TODO 添加并发控制 20 CXXSingletion* CXXSingletion::getInstance() 21 { 22 if (!m_pInstance) 23 { 24 m_pInstance = new CXXSingletion(); 25 std::cout << "构造单利执行..." << std::endl; 26 } 27 return m_pInstance; 28 }
(1)模板应用
1 // Singleton.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include "XXSingletion.h" 6 #include <iostream> 7 using namespace std; 8 9 int _tmain(int argc, _TCHAR* argv[]) 10 { 11 CXXSingletion* p = CXXSingletion::getInstance(); 12 p = CXXSingletion::getInstance(); 13 p = CXXSingletion::getInstance(); 14 p = CXXSingletion::getInstance(); 15 16 system("pause"); 17 return 0; 18 }
(2)输出展示