单例模式的概念和用途:

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

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

举例:

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. YIT-CTF—Web

    一:背后 打开传送门——>查看网页源代码——>1b0679be72ad976ad5d491ad57a5eec0——>用MD5解密 二:一种编码 [][(![]+[])[+[]]+([ ...

  2. JavaEE开发的颠覆者 Spring Boot实战--笔记

    1.Spring boot的三种启动模式 Spring 的问题 Spring boot的特点,没有特别的地方 1.Spring 基础 PS:关于spring配置 PS: 现在都已经使用 java配置, ...

  3. mysql export query result

    1 . export by shell a.sql use dbname; SELECT id,iab_num FROM iab_list ; mysql -h host -uusername -P3 ...

  4. Kettle入门--作业和转换的使用

    本来想在centos7下部署的,发现因为java版本的问题,无法成功部署,无奈,转到windows平台(后来找到解决方法了,在centos7系统下yum install webkitgtk* -y 就 ...

  5. 04基于python玩转人工智能最火框架之TensorFlow开发环境搭建

    MOOC_VM.vdl.zip 解压之后,得到一个vdl文件.打开virtual box,新建选择类型linuxubuntu 64位. 选择继续,分配2g.使用已有的虚拟硬盘文件,点击选择我们下载的文 ...

  6. 怎样优化app,看Facebook怎样做

    周四,Facebook Engineering blog 发表了一篇名为<Improving Facebook on Android>博文.博文从四个方面(Performance,Data ...

  7. Unity Blog 学习

    The Profiler window https://unity3d.com/cn/learn/tutorials/temas/performance-optimization/profiler-w ...

  8. windows删除文件或目录CMD命令

    rd/s/q 盘符:\某个文件夹  (强制删除文件文件夹和文件夹内所有文件)del/f/s/q 盘符:\文件名  (强制删除文件,文件名必须加文件后缀名)

  9. operator <<”不明确

    在声明重载的输出运算符<< 时,如果声明时的返回类型是std::ostream,而不是std::ostream&,但是定义的时候又加了引用的话,那么就会报“operator < ...

  10. haproxy参数

    https://blog.csdn.net/chengfei112233/article/details/78983026 https://www.cnblogs.com/dkblog/archive ...