zoukankan      html  css  js  c++  java
  • 单例模式

    一、简介

    1、单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。

    2、C++设计一个单例模式的方法如下:

            (1)构造函数声明为私有;   这样就保证了不能随意构造一个对象。

            (2) 将拷贝构造函数与等号运算符声明为私有,并不提供他们的实现; 即禁止对象被拷贝。

            (3) 在类中声明一个静态的全局访问接口;用来创建对象的接口函数。

            (4) 声明一个静态的私有实例化指针;将创建的对象保存在此,若已经创建则直接调用,否则创建新的。

    3、UML

    4、所属类别:创建型

    二、C++程序

     1 // 单例模式.cpp : 定义控制台应用程序的入口点。
     2 //
     3 
     4 #include "stdafx.h"
     5 #include<iostream>
     6 using namespace std;
     7 class Singleton 
     8 {
     9 private:
    10     Singleton()//构造函数一定要声明为私有的
    11     {
    12         cout<<"构造了一个singleton对象"<<endl;
    13     }
    14     static Singleton *instance;//静态的,为所有对象所共有
    15 public:
    16     static Singleton * getinstance()
    17     {
    18         if(NULL==instance)
    19         {
    20             instance =new Singleton();
    21         }
    22         return instance;
    23     }
    24     Singleton(const Singleton& ){}
    25     Singleton & operator=(const Singleton & ){}
    26 
    27     ~Singleton()  
    28     {  
    29     }  
    30 };
    31 
    32 Singleton * Singleton::instance; //静态变量的定义(注意类中的静态变量一定要定义,不然只声明的话,是不会被分配内存的)
    33 
    34 int _tmain(int argc, _TCHAR* argv[])
    35 {
    36     Singleton *s1=Singleton::getinstance();
    37     Singleton *s2=Singleton::getinstance();
    38     Singleton *s3=Singleton::getinstance();
    39     return 0;
    40 }

    上述程序中s1、s2、s3用了三次对象,但是其实只调用了一次构造函数,也可以通过地址看出。
    当然这样写有一个缺点是instance中申请的内存空间始终不会被释放的,解决办法可以看这个老兄的博客http://blog.csdn.net/ab198604/article/details/19196315

    另外注意:类声明中只描述如何分配内存,但是并不真正分配内存。所以静态变量要类之外定义(定义是分配内存的)后才能够使用,所以要在程序的第32写

    Singleton * Singleton::instance; 否则的话,instance都没有内存当然是没有办法存储new Singleton();了

  • 相关阅读:
    @NotNull @NotBlank @NotEmpty
    springboot @valid与@validated的参数校验使用总结
    一张表多个外键指向同一主键
    关于List的remove()方法
    双数据源切换问题
    前端通过jqplot绘制折线图
    关于js与jquery中的文档加载
    Mybatis中typeAliases的使用
    项目中常见数据库知识
    html中实现倒计时功能(setInterval,clearInterval)
  • 原文地址:https://www.cnblogs.com/bewolf/p/4252240.html
Copyright © 2011-2022 走看看