前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >单例模式

单例模式

作者头像
用户1215536
发布2018-02-05 11:41:13
6670
发布2018-02-05 11:41:13
举报

一、简介

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

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

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

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

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

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

3、UML

4、所属类别:创建型

二、C++程序

代码语言:javascript
复制
 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();了

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-01-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档