23 DesignPatterns学习笔记:C++语言实现 --- 1.3 Singletion

23 DesignPatterns学习笔记:C++语言实现 --- 1.3 Singletion

 2016-07-21

(www.cnblogs.com/icmzn)


模式理解

 23 DesignPatterns学习笔记:C++语言实现 --- 1.3 Singletion

 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)输出展示

23 DesignPatterns学习笔记:C++语言实现 --- 1.3 Singletion