设计模式--单例模式C++实现
单例模式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++实现的更多相关文章
- 设计模式 单例模式(Singleton) [ 转载2 ]
设计模式 单例模式(Singleton) [ 转载2 ] @author java_my_life 单例模式的结构 单例模式的特点: 单例类只能有一个实例. 单例类必须自己创建自己的唯一实例. 单例类 ...
- 设计模式 单例模式(Singleton) [ 转载 ]
设计模式 单例模式(Singleton) [ 转载 ] 转载请注明出处:http://cantellow.iteye.com/blog/838473 前言 懒汉:调用时才创建对象 饿汉:类初始化时就创 ...
- c#设计模式-单例模式(面试题)
c#设计模式-单例模式 单例模式三种写法: 第一种最简单,但没有考虑线程安全,在多线程时可能会出问题, public class Singleton { private static Singleto ...
- java设计模式单例模式 ----懒汉式与饿汉式的区别
常用的五种单例模式实现方式 ——主要: 1.饿汉式(线程安全,调用率高,但是,不能延迟加载.) 2.懒汉式(线程安全,调用效率不高,可以延时加载.) ——其他: 1.双重检测锁式(由于JVM底层内部模 ...
- 最简单的设计模式——单例模式的演进和推荐写法(Java 版)
前言 如下是之前总结的 C++ 版的:软件开发常用设计模式—单例模式总结(c++版),对比发现 Java 实现的单例模式和 C++ 的在线程安全上还是有些区别的. 概念不多说,没意思,我自己总结就是: ...
- ES6教程-字符串,函数的参数,了解函数的arguments对象,js面向对象,设计模式-单例模式,解构赋值
前言 主要讲解了ES6对字符串的拓展,包括includes,startsWith和endsWith,另外增加了字符串模板. Start includes()是否包含 startsWith()以什么开头 ...
- Java设计模式の单例模式
-------------------------------------------------- 目录 1.定义 2.常见的集中单例实现 a.饿汉式,线程安全 但效率比较低 b.单例模式的实现:饱 ...
- java设计模式——单例模式(一)
一. 定义与类型 定义:保证一个类仅有一个实例,并提供一个全局访问点 类型:创建型 二. 适用场景 想确保任何情况下都绝对只用一个实例 三. 优缺点 优点: 在内存里只有一个实例,减少了内存开销 可以 ...
- php实现设计模式————单例模式
php实现设计模式————单例模式 什么是单例模式 为什么要使用单例模式 php中有哪些方式实现新建一个对象实例 如何阻止这种实例化实现理想的单例模式 代码实现 什么是单例模式 为什么要使用单例模式 ...
- JAVA设计模式-单例模式(Singleton)线程安全与效率
一,前言 单例模式详细大家都已经非常熟悉了,在文章单例模式的八种写法比较中,对单例模式的概念以及使用场景都做了很不错的说明.请在阅读本文之前,阅读一下这篇文章,因为本文就是按照这篇文章中的八种单例模式 ...
随机推荐
- 查看pc ip地址
1.使用Windows+R键打开“运行”窗口,然后输入CMD进入命令提示窗口 2.进入命令窗口之后,输入:ipconfig/all 回车即可看到整个电脑的详细的IP配置信息
- python subplot 合并子图的方法
- Junit 并行执行测试
从Junit4.7开始可以并行运行测试. 必须设置parallel 参数,可以改变threadCount或useUnlimitedThreads属性. 测试中指定了parallel,项目使用的是 JU ...
- appium 底层原理
appium的log详细分析http://blog.csdn.net/jffhy2017/article/details/69372064----------------------很多appium架 ...
- vue指令与组件
参考http://blog.csdn.net/lioldamon/article/details/74058222?utm_source=itdadao&utm_medium=referral ...
- oracle lpad 函数使用介绍
函数介绍 lpad函数从左边对字符串使用指定的字符进行填充.从其字面意思也可以理解,l是left的简写,pad是填充的意思,所以lpad就是从左边填充的意思. 语法格式如下: lpad( string ...
- 20145316《Java程序设计》实验二报告
20145316<Java程序设计>实验二报告 一.实验目的与要求 1.初步掌握单元测试和TDD. 2.理解并掌握面向对象三要素:封装.继承.多态. 3.初步掌握UML建模. 4.熟悉S. ...
- oracle安装完成后目录中不论有没有tnsnames.ora和listener.ora文件 PLSQL都能连上的问题解决方法
今天遇到这个问题了,发现listener.ora文件和tnsnames.ora文件在Net Work文件夹下没有,正常情况下安装完oracle或者是oracle Client是会有的,但是在Net M ...
- MVc分页【关于使用扩展方法实现MVc分页】
近期对MVc自定义分页作了一下小研究下面把他记下来 下述代1,2,3里面的代码可以直接拷贝,4以后的根据情况自己选定 1.在后台任写如下的扩展方法(任一类库都可以,但是用时得引用命名空间) // 添加 ...
- ora-12154:tns:could not resolve the connect identifier specied
今天在发布网站时,点击登录之后出现了这个问题,修改一下环境变量,该问题就顺利解决了,解决方法如下: 在环境变量里,找到[Administrator的用户变量(U)],在其之下新建一个用户变量: 变量名 ...