单例模式C++实现

1描述:

单例模式,又称单件模式。

定义:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

2具体类图描述:

2.1 StartUML内部生成模式类图

该类图由StartUML逆向生成C++代码

class Singleton {
public:
    static Singleton* Instance();

protected:

Singleton();

private:
    static Singleton *instance;
};

Singleton* Singleton::Instance()

{

  if(instance==NULL)

    instance = new Singleton();

  return instance;

}

3.详解:

根据单例模式的定义,那么实现这个需求,我们最简单的方法是

①定义一个全局静态对象,给系统使用。

②单例模式实现需求。

注:这两个方都是可以满足需求的,但是呢,想想6大原则:依赖倒置,接口隔离。我们的设计应当是依赖接口,而非对象,那么久pass 刁①吧。

4单例模式的优缺点:

优点:一个实例,减少内存开销;减少系统开销;避免对一个资源的多重占用;设置全局访问点,优化和贡献资源。

缺点:没有借口,扩展性差;不利于测试;与单一职责原则有冲突,单例模式把“要单例”和业务逻辑融合在一个类中。

5使用场景:

要求生成唯一序列号的环境;

共享数据或者共享访问点;

创建一个对象需要消耗的资源过多,如访问IO和数据库等资源;

需要定义大量的静态常量和静态方法(工具类)

6线程安全问题

eg.当两个线程运行至if(instance==NULL)时,可能产生线程安全问题

改进解决

class Singleton {
public:
    static Singleton* Instance();

protected:

Singleton();

private:
    static Singleton *instance;
};

//对单例直接进行初始化,而不再方法Instance中进行判断。

Singleton* Singleton::instance = new Singleton;

Singleton* Singleton::Instance()

{

  return instance;

}

7单例模式的扩展--多例模式。

class Singleton {
public:
    static Singleton* Instance();

protected:

Singleton();

private:

  static enum{Max = 100};

  static int CurNum = 0;

static list<Singleton *>instance_list;

};

Singleton* Singleton::Instance()

{

  Random random = new Random();

  int count  = random.nextInt(Max);  //获取随机数

  return instance_list.get(count); //随机去除一个实例来用

}

8问题

关于多例模式中的list的初始化:

方案:

class Singleton
{
public:
static Singleton* GetInstance()
{
if (_singletonList.size() == 0)
{
//此处设置函数进行定制list也可
_singletonList.push_back(new Singleton());
_singletonList.push_back(new Singleton());
_singletonList.push_back(new Singleton());
}
else
{
//对于多例模式,选择例子,返回
Singleton* tmp = _singletonList.back();
_singletonList.pop_back();
return tmp;

}

}
protected:
Singleton()
{}
private:
static list<Singleton*> _singletonList;
};
list<Singleton*> Singleton::_singletonList(NULL);

void main()
{
Singleton* a = Singleton::GetInstance();
Singleton* b = Singleton::GetInstance();

}

设计模式--单例模式C++实现的更多相关文章

  1. 设计模式 单例模式(Singleton) [ 转载2 ]

    设计模式 单例模式(Singleton) [ 转载2 ] @author java_my_life 单例模式的结构 单例模式的特点: 单例类只能有一个实例. 单例类必须自己创建自己的唯一实例. 单例类 ...

  2. 设计模式 单例模式(Singleton) [ 转载 ]

    设计模式 单例模式(Singleton) [ 转载 ] 转载请注明出处:http://cantellow.iteye.com/blog/838473 前言 懒汉:调用时才创建对象 饿汉:类初始化时就创 ...

  3. c#设计模式-单例模式(面试题)

    c#设计模式-单例模式 单例模式三种写法: 第一种最简单,但没有考虑线程安全,在多线程时可能会出问题, public class Singleton { private static Singleto ...

  4. java设计模式单例模式 ----懒汉式与饿汉式的区别

    常用的五种单例模式实现方式 ——主要: 1.饿汉式(线程安全,调用率高,但是,不能延迟加载.) 2.懒汉式(线程安全,调用效率不高,可以延时加载.) ——其他: 1.双重检测锁式(由于JVM底层内部模 ...

  5. 最简单的设计模式——单例模式的演进和推荐写法(Java 版)

    前言 如下是之前总结的 C++ 版的:软件开发常用设计模式—单例模式总结(c++版),对比发现 Java 实现的单例模式和 C++ 的在线程安全上还是有些区别的. 概念不多说,没意思,我自己总结就是: ...

  6. ES6教程-字符串,函数的参数,了解函数的arguments对象,js面向对象,设计模式-单例模式,解构赋值

    前言 主要讲解了ES6对字符串的拓展,包括includes,startsWith和endsWith,另外增加了字符串模板. Start includes()是否包含 startsWith()以什么开头 ...

  7. Java设计模式の单例模式

    -------------------------------------------------- 目录 1.定义 2.常见的集中单例实现 a.饿汉式,线程安全 但效率比较低 b.单例模式的实现:饱 ...

  8. java设计模式——单例模式(一)

    一. 定义与类型 定义:保证一个类仅有一个实例,并提供一个全局访问点 类型:创建型 二. 适用场景 想确保任何情况下都绝对只用一个实例 三. 优缺点 优点: 在内存里只有一个实例,减少了内存开销 可以 ...

  9. php实现设计模式————单例模式

    php实现设计模式————单例模式 什么是单例模式 为什么要使用单例模式 php中有哪些方式实现新建一个对象实例 如何阻止这种实例化实现理想的单例模式 代码实现 什么是单例模式 为什么要使用单例模式 ...

  10. JAVA设计模式-单例模式(Singleton)线程安全与效率

    一,前言 单例模式详细大家都已经非常熟悉了,在文章单例模式的八种写法比较中,对单例模式的概念以及使用场景都做了很不错的说明.请在阅读本文之前,阅读一下这篇文章,因为本文就是按照这篇文章中的八种单例模式 ...

随机推荐

  1. 001-navicat for oracle 12 破解安装

    1.首先软件包和破解文件都需要到我给的百度云盘地址下载,去官网下载的中文版破解不了,至于官网的英文版,我就不清楚了. (1)链接地址. https://pan.baidu.com/s/1jxj4uzg ...

  2. vue跳转页面传值怎么传?

    这是路由跳转: this.$router.push( { name: 'holderResult', params: { meetingId:self.$route.params.meetingId} ...

  3. JavaScript之从头再来

    引入文件 1. 引入外部文件 <script type="text/javascript" src="JS文件"></script> 2 ...

  4. hdu3374 String Problem

    地址:http://acm.hdu.edu.cn/showproblem.php?pid=3374 题目: String Problem Time Limit: 2000/1000 MS (Java/ ...

  5. Winter-2-STL-F Ananagrams 解题报告及测试数据

    Time Limit:3000MS     Memory Limit:0KB  Description Most crossword puzzle fans are used to anagrams- ...

  6. SQL优化,解决系统运行效率瓶颈

    http://www.cnblogs.com/SameZhao/p/4737725.html

  7. CSS Fonts(字体)

    CSS Fonts(字体) 一.serif和sans-serif字体之间的区别 注意: 在计算机屏幕上,sans-serif字体被认为是比serif字体容易阅读. 二.CSS字型 在CSS中,有两种类 ...

  8. 关于git pull时出现的问题及解决反思

    前因 在前面由于已经git过一次,按照娄老师的要求,代码一个一个commit,所以删掉之前的git仓库(用la查看,使用rm -rf .git删除).但远程origin已经存在,所以执行git rem ...

  9. 20145335郝昊《Java程序设计》第2周学习总结

    20145335郝昊<Java程序设计>第2周学习总结 教材学习内容总结 一.类型.变量与运算符 1.类型 整数: 可细分为为short整数(占2字节),int整数(占4字节),long整 ...

  10. 在Linux终端管理文件你要知道的11个命令

    LS - 列表文件 ls命令列出目录中的文件. 默认情况下,使用ls列出当前目录下的文件. 2 你也可以列出文件递归-也就是说,列出所有文件在当前目录中的目录-使用ls -R.LS还可以列出在其他目录 ...