singleton模式 C++
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++相关推荐
- Android发展Singleton模式
这是什么Singleton模式?它是Java23之间的一种模式,在Android发展也有着广泛的应用,例Calander类别,当对象是由未创建 new Calander而是Calander.getIn ...
- Singleton模式笔记
在C++中,尽量用Singleton替换全局变量是个很好的建议,Singleton一般如下: class CSingleton { private: static CSingleton* m ...
- java设计模式:Singleton模式
Singleton模式是java中用到最多的设计模式.用于控制的个数,防止多余的实例化及修改.在仅有一个对象存在时,操作很有效. 1.构造函数私有化,其它类不能实例化对象 2.引用私有化,没有其它的修 ...
- Singleton模式学习
动机(Motivation) 在软件系统中,经常有这样一些类,必须保证它们在系统中只存在一个类的实例,才能确保它们逻辑的正确性,以及良好的效率 如何绕过常规的构造器,提供一种机制来保证一个类只有一个实 ...
- 细颗粒度Singleton模式实现
作为一个很典型的设计模式,Singleton模式常常被用来展示设计模式的技巧,并且随着技术的演进,.NET语言和Java都已经把经典<Design Patterns : Elements of ...
- Design Pattern: Singleton 模式
一句话概括:保证一个类仅有一个实例,并提供一个访问它的全局访问点. Singleton的英文意义是独身,也就是只有一个人,应用在物件导向语言上,通常翻译作单例:单一个实例(Instance). 很多 ...
- 剑指 offer set 28 实现 Singleton 模式
singleton 模式又称单例模式, 它能够保证只有一个实例. 在多线程环境中, 需要小心设计, 防止两个线程同时创建两个实例. 解法 1. 能在多线程中工作但效率不高 public sealed ...
- Singleton模式的实现
1.实现Singleton模式 设计一个类,我们只能生成该类的一个实例. 2.低级解法一:只适用于单线程环境 因为我们只能生成一个实例,所以我们必须把构造函数设置为私有函数已禁止他人创建实例.可以定义 ...
- 人工智能——Singleton模式
上次在状态模式中的设计有一个严重的问题,就是如下: voidCTroll::ChageState(CState* pNewState) { deletem_pCurrentState; ...
- 转:Singleton模式
C++完美实现Singleton模式 转自:http://www.cppblog.com/dyj057/archive/2005/09/20/346.html boost库的Singleton的实现 ...
最新文章
- Linux查看dmesg日志,Linux中的Printk与dmesg功能
- oracle adf immediate,Oracle ADF 双击行事件
- iOS开发UI篇 -- UISearchBar 属性、方法详解及应用(自定义搜索框样式)
- Myeclipse2013下载,安装,破解,介绍(CSDN首发)
- mysql flush cache_mysql的SQL_NO_CACHE(在查询时不使用缓存)和sql_cache用法
- C# 用Attribute实现AOP事务
- excel取整函数_查询函数Choose、Lookup、Hlookup、Vlookup应用技巧解读
- 自定义吐司Toast小进阶
- php获取最后一条记录的id,获取MySQL的表中每个userid最后一条记录的方法_MySQL
- 破解版软件-20131014更新
- 小程序框架kbone与Hybird混合开发
- 华为网络配置(ACL)
- 去掉scan pattern多余port的方法
- 深入探索REST(1):如何设计好的RESTful API?
- 国家级示范高等职业院校网址
- js获取本月初与月底的时间、获取前一天的时间。
- 【IoT】基于 CC2530 的 ZigBee 物联网系统设计
- 2014工作总结与2015展望
- python爬虫--scrapy框架的学习和使用(七)⭐---第二部分
- 免费天气查询工具类源码,开箱即用,根据中国气象局API编写。高效稳定