文档章节

生活中的单例——只爱一个人

Simon丶Ma
 Simon丶Ma
发布于 2016/04/14 14:38
字数 615
阅读 2
收藏 0

生活中的单例——只爱一个人

什么是单例?

单例就如同恋爱,一生只爱一个人,让她(他)成为你生命中的唯一!

单例就是一个类只能有一个对象,其它类要使用这个类时,有且只能获得这个类的唯一一个对象。比如在我们生活的世界中,有生命的星球只有一个——地球(至少到目前为止人类所发现的世界中是这样的)。

        


 


 

单例的实现

单例的实现有很多种方式,当然我不会给你一一例举各种方式,我就讲一个最简单的实现方式,相信你也很容易能想到这种方式:

Singleton.h:

#ifndef __SINGLETON_H__
#define __SINGLETON_H__
#include <string>
//星球类
class Planet
{
public:
virtual ~Planet();
static Planet* GetInstance(const std::string& name);
std::string GetName();
private:
Planet(const std::string& name);
std::string m_name;
static Planet* s_pPlanet;
};
#endif	//__SINGLETON_H__


 

Singleton.cpp:

#include "stdafx.h"
#include "Singleton.h"
Planet* Planet::s_pPlanet = NULL;
Planet::Planet( const std::string& name ) : m_name(name)
{
}
Planet::~Planet()
{
}
Planet* Planet::GetInstance(const std::string& name)
{
if (s_pPlanet == NULL)
{
s_pPlanet = new Planet(name);
}
return s_pPlanet;
}
std::string Planet::GetName()
{
return m_name;
}


 

是不是很简单?但如果只是这么简单的话就完善了的话,我也就必要写了。

你有没有发现一个问题:s_pPlanet成员创建(new)出来对象了,但没有地方释放(delete)它。这是很危险的,这样的话s_pPlanet创建的内存空间只有当程序结束退出进程时才会由操作系统释放它。

我们不能在程序中主动释放创建出来的程序问题危险,即使它不会出现任何问题,那也是一个不健全的程序。那我们对上面的程序再进行一个改进:

Singleton.h:

#ifndef __SINGLETON_H__
#define __SINGLETON_H__
#include <string>
//星球类
class Planet
{
public:
virtual ~Planet();
static Planet* GetInstance(const std::string& name);
std::string GetName();
private:
Planet(const std::string& name);
std::string m_name;
static Planet* s_pPlanet;
class Garbo{
public:
~Garbo()
{
if (Planet::s_pPlanet != NULL)
{
delete Planet::s_pPlanet;
}
}
};
static Garbo s_Carbo;
};
#endif	//__SINGLETON_H__

上面的Garbo是一个内部类,只有一个功能,就是专门用于用于释放s_pPlanet对象。在Planet类中定义了一个Garbo类型的静态成员 s_Carbo,当退出整个文件的作用域时将会自动析构s_Carbo对象,而析构s_Carbo对象时将会释放s_pPlanet对象。

应用场景

在一个类只需要有一个对象的情况。如你操作系统中的任务管理器、回收站,网站的访问量计数器等。

© 著作权归作者所有

Simon丶Ma
粉丝 4
博文 134
码字总数 299850
作品 0
深圳
程序员
私信 提问
婚礼不只是一种仪式,还是一种入职…

Netflix出品美国喜剧。由《鬼屋电影》、《惊声尖笑》原班人马最打造剧,改编瑞典R级喜剧《婚前兴行为》,出过爆笑喜剧《小姐好白》的马龙韦恩斯担纲裸男主,讲述新郎在结婚当日早晨,发现自己...

hlw521hxq
2017/12/04
0
0
一些自己喜欢的句子 看看你喜欢不

1、总有几分钟,其中的每一秒,你都愿意拿一年去换取。总有几颗泪,其中的每一次抽泣,你都愿意拿满手的承诺去代替。总有几段场景,其中的每幅画面,你都愿意拿全部的力量去铭记。总有几句话...

wangado2
2018/04/04
0
0
C#单例

转自:http://www.cnblogs.com/zhili/p/SingletonPatterm.html 一、引言 最近在设计模式的一些内容,主要的参考书籍是《Head First 设计模式》,同时在学习过程中也查看了很多博客园中关于设...

qq_24378389
2017/09/10
0
0
千万别让程序员带孩子,否则你一定很后悔!

最近一个在小型创业公司工作的程序员朋友和我说:“我们公司,两个前端,三个php,一个ios,一个安卓,还有一个UI,可怕的是只有这个ui是妹子。。。” 他还说,这个学UI的妹子经常吐槽他们不...

web前端程序员
2017/11/25
0
0
IT人更有情感

发表这个博客的时候,刚刚跟家里人视频完,一直在想自己长这么大,为母亲做过什么,陪伴过家里人多长时间,一直在外面,为了什么,为了技术?为了生活?生活为了什么?为了自己?不是!为了挣...

2013yang
2017/03/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
2.1K
14
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
38
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
40
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
61
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部