singleton 模式 C++

基本形态

#include <iostream>
#include <string>class TestSingleton
{public:static TestSingleton *create_instance(void){if (instance_ == nullptr) {instance_ = new TestSingleton();if (instance_ && instance_->init() < 0) {std::cerr << "fail to create TestSingleton instance" << std::endl;}}return instance_;}void destroy(void) {delete instance_;}int print_name(void) {std::cout << name_ << std::endl;};
private:TestSingleton() {name_ = "TestSpace";}~ TestSingleton() { };int init(void) {return 1;}static TestSingleton *instance_;std::string name_;
};TestSingleton *TestSingleton::instance_ = nullptr;
  • 私有的静态指针变量,以及public的create_instance()函数
  • 私有的构造函数和析构函数(防止唯一实例在其他地方被创建)

(静态成员函数可以访问私有成员,唯一的区别是,静态成员函数没有this指针,只能用对象实例指针来访问私有成员)

工厂方法的基本形态

在上面给出的代码示例中,用到了工厂方法,这里给出工厂方法使用的基本形态。

abstractClass *create_instance(void)
{concreteClass *instance = nullptr;instance = new concreteClass();if (instance && instance->init() < 0) {std::cerr << "fail to create TestSingleton instance" << std::endl;}return instance;
}

new 实体类,首先分配内存,然后调用构造函数,构造函数没有返回值导致不能判断所有构造初始化过程是否失败。所以添加一个init函数,这个函数完成除基本赋初值之外的其他初始化过程。

多线程保护

使用shared_ptr 计数

#ifndef _TEST_SHARED_PTR_
#define _TEST_SHARED_PTR_#include <memory>
#include <mutex>
#include <iostream>class Singleton
{public:static std::shared_ptr<Singleton> create_instance(void);void destroy_instance(void);
private:void destroy();static std::shared_ptr<Singleton> g_singleton;static std::mutex                 g_mutex_singleton;Singleton() { std::cout << "create SingleTon" << std::endl; }virtual ~Singleton() { std::cout << "destroy SingleTon" << std::endl;}
};#endif /* _TEST_SHARED_PTR_ */
#include <functional>
#include "test_shared_ptr.h"std::shared_ptr<Singleton> Singleton::g_singleton;
std::mutex                 Singleton::g_mutex_singleton;std::shared_ptr<Singleton> Singleton::create_instance(void)
{Singleton *test = nullptr;std::lock_guard<std::mutex> lock(g_mutex_singleton);if (!g_singleton) {g_singleton.reset(new Singleton(), std::bind(&Singleton::destroy, std::placeholders::_1));}return g_singleton;
}void Singleton::destroy_instance(void)
{std::lock_guard<std::mutex> lock(g_mutex_singleton);g_singleton.reset();
}void Singleton::destroy()
{delete this;
}int main(int argc, char *argv[])
{std::shared_ptr<Singleton> test_singleton;test_singleton = Singleton::create_instance();test_singleton->destroy_instance();return 0;
}

满足构造函数析构函数私有,create_instance, destroy 开放的要求。
shared_ptr 的reset()方法将shared_ptr 清空,ref_count减到0

singleton模式 C++相关推荐

  1. Android发展Singleton模式

    这是什么Singleton模式?它是Java23之间的一种模式,在Android发展也有着广泛的应用,例Calander类别,当对象是由未创建 new Calander而是Calander.getIn ...

  2. Singleton模式笔记

    在C++中,尽量用Singleton替换全局变量是个很好的建议,Singleton一般如下: class  CSingleton { private:     static CSingleton* m ...

  3. java设计模式:Singleton模式

    Singleton模式是java中用到最多的设计模式.用于控制的个数,防止多余的实例化及修改.在仅有一个对象存在时,操作很有效. 1.构造函数私有化,其它类不能实例化对象 2.引用私有化,没有其它的修 ...

  4. Singleton模式学习

    动机(Motivation) 在软件系统中,经常有这样一些类,必须保证它们在系统中只存在一个类的实例,才能确保它们逻辑的正确性,以及良好的效率 如何绕过常规的构造器,提供一种机制来保证一个类只有一个实 ...

  5. 细颗粒度Singleton模式实现

    作为一个很典型的设计模式,Singleton模式常常被用来展示设计模式的技巧,并且随着技术的演进,.NET语言和Java都已经把经典<Design Patterns : Elements of ...

  6. Design Pattern: Singleton 模式

    一句话概括:保证一个类仅有一个实例,并提供一个访问它的全局访问点. Singleton的英文意义是独身,也就是只有一个人,应用在物件导向语言上,通常翻译作单例:单一个实例(Instance).  很多 ...

  7. 剑指 offer set 28 实现 Singleton 模式

    singleton 模式又称单例模式, 它能够保证只有一个实例. 在多线程环境中, 需要小心设计, 防止两个线程同时创建两个实例. 解法 1. 能在多线程中工作但效率不高 public sealed ...

  8. Singleton模式的实现

    1.实现Singleton模式 设计一个类,我们只能生成该类的一个实例. 2.低级解法一:只适用于单线程环境 因为我们只能生成一个实例,所以我们必须把构造函数设置为私有函数已禁止他人创建实例.可以定义 ...

  9. 人工智能——Singleton模式

    上次在状态模式中的设计有一个严重的问题,就是如下: voidCTroll::ChageState(CState* pNewState) {        deletem_pCurrentState; ...

  10. 转:Singleton模式

    C++完美实现Singleton模式  转自:http://www.cppblog.com/dyj057/archive/2005/09/20/346.html boost库的Singleton的实现 ...

最新文章

  1. Linux查看dmesg日志,Linux中的Printk与dmesg功能
  2. oracle adf immediate,Oracle ADF 双击行事件
  3. iOS开发UI篇 -- UISearchBar 属性、方法详解及应用(自定义搜索框样式)
  4. Myeclipse2013下载,安装,破解,介绍(CSDN首发)
  5. mysql flush cache_mysql的SQL_NO_CACHE(在查询时不使用缓存)和sql_cache用法
  6. C# 用Attribute实现AOP事务
  7. excel取整函数_查询函数Choose、Lookup、Hlookup、Vlookup应用技巧解读
  8. 自定义吐司Toast小进阶
  9. php获取最后一条记录的id,获取MySQL的表中每个userid最后一条记录的方法_MySQL
  10. 破解版软件-20131014更新
  11. 小程序框架kbone与Hybird混合开发
  12. 华为网络配置(ACL)
  13. 去掉scan pattern多余port的方法
  14. 深入探索REST(1):如何设计好的RESTful API?
  15. 国家级示范高等职业院校网址
  16. js获取本月初与月底的时间、获取前一天的时间。
  17. 【IoT】基于 CC2530 的 ZigBee 物联网系统设计
  18. 2014工作总结与2015展望
  19. python爬虫--scrapy框架的学习和使用(七)⭐---第二部分
  20. 免费天气查询工具类源码,开箱即用,根据中国气象局API编写。高效稳定

热门文章

  1. Web前端大作业、基于HTML+CSS+JavaScript响应式个人相册博客网站
  2. java 鼠标动眼睛动_java实现眼睛跟着鼠标转动的跟踪眼代码
  3. Daz导出模型的部件中英文对照
  4. 如何成为高效的学习高手
  5. Ubuntu 搜狗输入法 中文 无法切换 英文
  6. 自动驾驶领域的Android?百度能否超越特斯拉和谷歌
  7. 蚂蚁集团IPO的小秘密:人均月薪5.5万,利润有望超中国石油
  8. 电压和电流的参考方向
  9. 我分析了b站10万条弹幕,发现了歪嘴战神的终极奥义!(文末重磅福利)
  10. PWM(脉冲宽度调制)信号原理