单例模式的概念和用途:

在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便实例个数的控制并节约系统资源。

如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。(直白地说单例模式的写法也是种套路,见例子便知。)

举例:

1. 主席

目的:为了让类中只有一个实例,实例不需要自己释放

• 将 默认构造 和 拷贝构造 私有化
• 内部维护一个 对象指针
• 私有化唯一指针
• 对外提供getinstance方法来访问这个指针
• 保证类中只能实例化一个对象

#include<iostream>
using namespace std; //创建主席类
//需求 单例模式 为了创建类中的对象,并且保证只有一个对象实例
class ChairMan {
private:
ChairMan()
{
cout << "创建主席" << endl;
}
//拷贝构造 私有化
ChairMan(const ChairMan&c) {}
public:
//提供 get方法 访问 主席
static ChairMan* getInstance() {
return singleMan;
} private:
static ChairMan * singleMan;
};
ChairMan * ChairMan::singleMan = new ChairMan; void test01() {
ChairMan *cm1 = ChairMan::getInstance();
ChairMan *cm2 = ChairMan::getInstance();
if (cm1 == cm2) {
cout << "cm1与cm2相同" << endl;
}
else cout << "cm1与cm2不同" << endl; /*ChairMan *cm3 = new ChairMan(*cm2);
if (cm3 == cm2) {
cout << "cm3与cm2相同" << endl;
}
else cout << "cm3与cm2不同" << endl;*/
} int main() { cout << "main调用" << endl; //主席创建先于main调用
test01(); system("pause");
return ;
}

2. 打印机

用单例模式,模拟公司员工使用打印机场景,打印机可以打印员工要输出的内容,并且可以累积打印机使用次数。

#include<iostream>
#include<string>
using namespace std; class Printer {
private:
Printer() { m_Count = ; };
Printer(const Printer& p); public:
static Printer* getInstance() {
return singlePrinter;
} void printText(string text) {
cout << text << endl;
m_Count++;
cout << "打印机使用次数:" << m_Count << endl;
} private:
static Printer* singlePrinter;
int m_Count;
}; Printer* Printer::singlePrinter = new Printer; void test1() {
//拿到打印机
Printer* printer = Printer::getInstance(); printer->printText("离职报告");
} int main() {
test1(); system("pause");
return ;
}

3. 模板

 #include <iostream>

 using namespace std;

 class Singleton
{
private:
Singleton()
{
cout << "Singleton" << endl;
}
~Singleton()
{
cout << "~Singleton" << endl;
} private:
static Singleton* _pInstance; public:
static Singleton * getInstance()
{
if(nullptr == _pInstance)
{
_pInstance = new Singleton;
}
return _pInstance;
}
static void destroy()
{
if(_pInstance)
{
delete _pInstance;
}
}
void print() const
{
cout << "Singleton::print()" << endl;
}
}; Singleton* Singleton::_pInstance = nullptr; int main()
{
Singleton * p1 = Singleton::getInstance();
Singleton * p2 = Singleton::getInstance(); p1->print();
p2->print();
Singleton::getInstance()->print();
Singleton::destroy(); return ;
}

C++单例模式的实现及举例的更多相关文章

  1. 如何防止JAVA反射对单例类的攻击?

    在我的上篇随笔中,我们知道了创建单例类有以下几种方式: (1).饿汉式; (2).懒汉式(.加同步锁的懒汉式.加双重校验锁的懒汉式.防止指令重排优化的懒汉式); (3).登记式单例模式; (4).静态 ...

  2. 谈谈OKHttp的几道面试题

    来吧,今天说说常用的网络框架OKHttp,也是现在Android所用的原生网络框架(Android 4.4开始,HttpURLConnection的底层实现被Google改成了OkHttp),GOGO ...

  3. Android面试题《思考与解答》11月刊

    又来更新啦,Android面试题<思考与解答>11月刊奉上. 说说View/ViewGroup的绘制流程 View的绘制流程是从ViewRoot的performTraversals开始的, ...

  4. 真实的C++单例模式举例

    把构造函数声明为protected的理由很简单,但把构造函数声明为private的原因却很少知道.   从语法上讲,任何函数如果被声明为private,这个函数就不能从外部调用,构造函数也是函数,相反 ...

  5. PHP 面向对象编程和设计模式 (3/5) - 单例模式和工厂模式

    PHP高级程序设计 学习笔记 2014.06.11 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容 ...

  6. 设计模式之单例模式Singleton(三创建型)

    1.什么事单例模式? 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须 ...

  7. 设计模式(2)--单例模式(Singleton Pattern)

    概述 一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称):当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的 ...

  8. C#设计模式-单例模式

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

  9. 【JAVA单例模式详解】

    设计模式是一种思想,适合于任何一门面向对象的语言.共有23种设计模式. 单例设计模式所解决的问题就是:保证类的对象在内存中唯一. 举例: A.B类都想要操作配置文件信息Config.java,所以在方 ...

随机推荐

  1. hdu4990 Reading comprehension 矩阵快速幂

    Read the program below carefully then answer the question.#pragma comment(linker, "/STACK:10240 ...

  2. day39KNN算法和其他的算法

    PS: 1.现在明白为什么其他的同学一直都在做数字图像处理,matlab这种东西了,因为机器学习,其他底层主要是做预先处理,然后调用某一个算法 2.感觉knn算法就是根据先验数据计算下一个跟自己一样不 ...

  3. postgresql的基本使用,以及数据库的备份与恢复

    安装过程没什么说的,基本是一直下一步下一步,就是中间需要输入密码之类的 postgresql使用模式是数据库表,视图等的集合,我们可以自荐创建一个schema 创建表的方法 进入sql命令行窗口的方法 ...

  4. scala函数等号省略

    例1: 此时没有写返回值,但是有等号,函数会自己推断返回值,此时的返回值是Int def add(x:Int, y:Int) = { x+y} 例2: 此时没有写返回值,也没有等号,无论函数内部有没有 ...

  5. php创建桌面快捷方式实现方法

    http://blog.csdn.net/fdipzone/article/details/50423613

  6. 第1节 常用DOS(磁盘操作系统)命令

    一.打开DOS命令窗口 1)快捷键:win + r,打开命令提示符窗口: 2)左击“开始”菜单,在运行里输入cmd,按回车打开命令提示符窗口: 二.常见命令 1)文件夹操作: d:+ 回车:盘符切换 ...

  7. 如何优化JavaScript的构造函数

    首先看一个构造函数User,我们在调用User创建一个实例的的时候,一般都是要写上new操作符的.在这里说明一下,如果使用new关键字调用构造函数,那么构造函数里面的this总是是指向一个全新的对象( ...

  8. GoJS v1.8.12 去掉水印

    找到这段代码, 特征:1. 含有字符串:'7eba17a4ca3b1a8346','78a118b7':2. 也可能不为aw,根据具体情况来操作. a.aw=d[D.Wg("7eba17a4 ...

  9. jdk动态代理在idea的debug模式下不断刷新tostring方法

    在jdk的动态代理下,在使用idea进入动态代理的debug模式下,单步调试会刷新idea的tostring方法,让他自己重走了一遍代理 这个问题暂时无解

  10. Java的date和string互转

    https://blog.csdn.net/angus_17/article/details/7656631