zoukankan      html  css  js  c++  java
  • 23 DesignPatterns学习笔记:C++语言实现 --- 1.3 Singletion

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

  • 相关阅读:
    Java基础语法学习18——方法(2)
    Java基础语法学习17——方法(1)
    Java基础语法学习16——二维数组
    Java8新特性Lambda表达式
    Web编程规范之三层架构设计规范
    Mybatis初体验
    Servlet快速入门:第一个Servlet程序
    Java中常用IO流之文件流的基本使用姿势
    Java中异常关键字throw和throws使用方式的理解
    Java中关于泛型集合类存储的总结
  • 原文地址:https://www.cnblogs.com/icmzn/p/5693438.html
Copyright © 2011-2022 走看看