对象性能模式

面向对象很好地解决了"抽象”的问题,但是必不可免地要付出一定的代价。对于通常情况来讲,面向对象的成本大都可以忽略不计。但是某些情况,面向对象所带来的成本必须谨慎处理。

典型模式

  • Singleton
  • Flyweight

Singleton

单例模式其意图是:保证一个类只有一个实例,并提供一个访问它的全局访问点。

  • 为了防止外部类构造实例,需要将构造函数的访问权限标记为protected或private;
  • 需要提供全局访问点,就需要在类中定义一个static函数,返回在类内部唯一构造的实例。

线程非安全版本

#include <iostream>class Singleton{private:Singleton(){std::cout<<"constructor called!"<<std::endl;}Singleton(Singleton&)=delete;Singleton& operator=(const Singleton&)=delete;static Singleton* m_instance_ptr;
public:~Singleton(){std::cout<<"destructor called!"<<std::endl;}static Singleton* get_instance(){if(m_instance_ptr==nullptr){m_instance_ptr = new Singleton;}return m_instance_ptr;}void use() const { std::cout << "in use" << std::endl; }
};Singleton* Singleton::m_instance_ptr = nullptr;int main(){Singleton* instance = Singleton::get_instance();Singleton* instance_2 = Singleton::get_instance();return 0;
}

线程安全版本,但锁的代价过高

#include <iostream>
#include <mutex>class Singleton
{private:Singleton(){std::cout << "constructor called!" << std::endl;}Singleton(Singleton &) = delete;Singleton &operator=(const Singleton &) = delete;static Singleton *m_instance;static std::mutex m_mtx;public:~Singleton(){std::cout << "destructor called!" << std::endl;}static Singleton *get_instance(){std::lock_guard<std::mutex> lk{m_mtx};if (m_instance == nullptr){m_instance = new Singleton();}return m_instance;}
};Singleton *Singleton::m_instance = nullptr;
std::mutex Singleton::m_mtx;int main()
{Singleton *instance = Singleton::get_instance();Singleton *instance_2 = Singleton::get_instance();return 0;
}

双检查锁,但由于内存读写reorder不安全

#include <iostream>
#include <mutex>class Singleton
{private:Singleton(){std::cout << "constructor called!" << std::endl;}Singleton(Singleton &) = delete;Singleton &operator=(const Singleton &) = delete;static Singleton *m_instance;static std::mutex m_mtx;public:~Singleton(){std::cout << "destructor called!" << std::endl;}static Singleton *get_instance(){if (m_instance == nullptr){std::lock_guard<std::mutex> lk{m_mtx};if (m_instance == nullptr){m_instance = new Singleton();}}return m_instance;}
};Singleton *Singleton::m_instance = nullptr;
std::mutex Singleton::m_mtx;int main()
{Singleton *instance = Singleton::get_instance();Singleton *instance_2 = Singleton::get_instance();return 0;
}

线程安全、内存安全的(智能指针,锁)

#include <iostream>
#include <memory>
#include <mutex>
class Singleton
{public:typedef std::shared_ptr<Singleton> Ptr;~Singleton(){std::cout << "destructor called!" << std::endl;}Singleton(Singleton &) = delete;Singleton &operator=(const Singleton &) = delete;static Ptr get_instance(){if (m_instance_ptr == nullptr){std::lock_guard<std::mutex> lk(m_mutex);if (m_instance_ptr == nullptr){m_instance_ptr = std::shared_ptr<Singleton>(new Singleton);}}return m_instance_ptr;}private:Singleton(){std::cout << "constructor called!" << std::endl;}static Ptr m_instance_ptr;static std::mutex m_mutex;
};Singleton::Ptr Singleton::m_instance_ptr = nullptr;
std::mutex Singleton::m_mutex;int main()
{Singleton::Ptr instance = Singleton::get_instance();Singleton::Ptr instance2 = Singleton::get_instance();return 0;
}

使用静态局部变量安全又高效

#include <iostream>class Singleton
{public:~Singleton(){std::cout << "destructor called!" << std::endl;}Singleton(const Singleton &) = delete;Singleton &operator=(const Singleton &) = delete;static Singleton &get_instance(){static Singleton instance;return instance;}private:Singleton(){std::cout << "constructor called!" << std::endl;}
};int main(int argc, char *argv[])
{Singleton &instance_1 = Singleton::get_instance();Singleton &instance_2 = Singleton::get_instance();return 0;
}

C++设计模式 - 单例模式(Singleton)相关推荐

  1. Android设计模式——单例模式(Singleton)

    二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元 ...

  2. 常见设计模式—单例模式(Singleton)

    前言 好久没写东西了,但是想着无论什么事还是要坚持自己初心要坚持的东西.写东西不能断! 对于常用的23种设计模式,这里笔者会根据自己学习和出现频率.重要程度进行学习记录吧.并且每种设计模式可能会根据暂 ...

  3. C++设计模式--单例模式(Singleton)及单例通用模板

    概述 C++中的单例模式应该是设计模式中最简单的了,在编码中常见到.那么,简单的总结下 C++中的单例模式写法,以及根据单例模式扩展后的一些写法,最后还有单例的通用模板,可用于快捷创建一个单例类. 单 ...

  4. 设计模式 -- 单例模式(Singleton)

    写在前面的话:读书破万卷,编码如有神 -------------------------------------------------------------------- 主要内容包括: 初始单例 ...

  5. 设计模式——单例模式(Singleton)

    保证一个类仅有一个实例,并提供一个访问它的全局访问点.--DP UML类图 模式说明 个人认为单例模式是所有设计模式中最为简单的一个模式,因为实现这个模式仅需一个类,而不像其他模式需要若干个类.这个模 ...

  6. Python 设计模式: 单例模式(singleton pattern)

    2019独角兽企业重金招聘Python工程师标准>>> 如果想在整个程序的运行过程中,某个类只有一个实例的话,可以通过单例模式来实现. 在 Python 中实现单例模式有很多种方式, ...

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

    单例模式可以保证一个类有且只有一个实例,并提供一个访问它的全局访问点.在程序设计中,有很多情况需要确保一个类只能有一个实例.从这句话可以看出,Singleton模式的核心:如何控制用户使用new对一个 ...

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

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

  9. 设计模式---单例模式Singleton

    /*** 饿汉式* 类加载到内容后,就实例化一个实例,* JVM保证线程安全: JVM保证每一个Class只会load到内存一次,static关键字是在Class load到内存之后马上就行初始化,也 ...

  10. 趣谈设计模式 | 单例模式(Singleton) :独一无二的对象

    文章目录 单例模式 饿汉模式 懒汉模式 懒汉和饿汉的区别 单例模式 一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全 局访问点,该实例被所有程序模块共享. ...

最新文章

  1. LeetCode简单题之托普利茨矩阵
  2. Duanxx的图像处理学习: 透视变换(一)
  3. 27 JSX函数子元素的应用与思考
  4. C语言变长数组data[0]【总结】
  5. linux 下zip文件的压缩和解压
  6. gesturedetector.java_我的flutter代码中的GestureDetector不起作用
  7. 数据结构基础(8) --单链表的设计与实现(1)之基本操作
  8. 如何使用Docker轻松集成OnlyOffice和NextCloud--快速搭建私有云办公系统/私有云盘/私有OfficeOnline
  9. 如何设置jquery的ajax方法为同步
  10. audio插入背景音乐_网页制作中的html插入背景音乐
  11. div+css完成首页布局
  12. McBSP初始化以及和EDMA的结合使用(C64X DSP)
  13. android 前后台,Android App前后台监控
  14. oracle 提取重复数据,oracle里面查询重复数据的方法
  15. 计算机管理服务无法显示,打印机属性无法打开,始终显示: 无法显示计算机属性. 后台打印程序服务未运行....
  16. Java反射 二三事
  17. 【系列1】使用Dockerfile创建带sshd服务的Centos Docker镜像
  18. SaaS、PaaS、IaaS是什么意思
  19. 【数据技术】关于HP Vertica MPP列式数据库资源池设置的一点心得
  20. 【飞然教练】网络游戏怎么样赚钱?

热门文章

  1. json批量转换成label图像
  2. python程序员培训_推荐给未来Python程序员的自学路线,不再背负小白名称
  3. AccessibilityService的学习,抢红包实现
  4. Dreamweaver CS 5 快捷键大全
  5. python cmap_Python cmap包_程序模块 - PyPI - Python中文网
  6. win10安装虚拟机Linux Centos7系统网络配置
  7. AlphaMind:趋势跟踪及量化交易系统
  8. 使用Spring Data访问MongoDB数据库
  9. 浏览器打开服务器上的图片无法显示,网页中的图片打不开怎么办?原因与解决办法...
  10. 12306火车票查询——Python