c++ 设计模式23讲之单例模式

单例模式

定义:

确保一个类只有一个实例,并提供全局访问点来访问这个实例

优点:

(1)内存中只存唯一实例可节省系统资源

(2)用户可以严格控制实例

缺点:

(1)没有抽象层,违反了依赖倒置原则(可通过依赖注入来达到单例模式相同效果)

(2)单例类职责过重,会违反单一原则

(3)垃圾自动回收技术的语言,实例长时间不用会回收导致实例对象状态的丢失

使用范围:

需要单一实例的环境,如日志操作、文件操作等

结构:

实现:

单例模式(singleton_pattern)属于创建型模式(creational_pattern),所以定义了namespace creational_pattern的命名空间。

开发IDE:vs2015

C++11特性

类的定义声明如下:

namespace creational_pattern
{
	class singleton_pattern final
	{
	public:
		
		virtual ~singleton_pattern() noexcept;
		static singleton_pattern& getInstance();
		int testFun();

	private:
		singleton_pattern() = default;
		singleton_pattern(const singleton_pattern& sp) = delete;
		singleton_pattern& operator= (const singleton_pattern& sp) = delete;
		singleton_pattern(const singleton_pattern&& sp) = delete;
		singleton_pattern& operator= (const singleton_pattern&& sp) = delete;
	};	
}

creational_pattern::singleton_pattern::~singleton_pattern() noexcept
{
}

singleton_pattern& singleton_pattern::getInstance()
{
	static singleton_pattern instance{};
	return instance;
}


int singleton_pattern::testFun()
{ 
	std::cout << "单例模式测试方法" << std::endl; 
	return 0;
}

测试:

基于GoogleTest 的单元测试框架;框架可参考如下网址:

https://www.cnblogs.com/jycboy/p/gtest_catalog.html

TEST(test_singleton_pattern_getInstance, isSameAddress)
{
    ASSERT_EQ(&creational_pattern::singleton_pattern::getInstance(), &creational_pattern::singleton_pattern::getInstance());
}

TEST(test_singleton_pattern_testFun, runSuceess)
{
    ASSERT_EQ(creational_pattern::singleton_pattern::getInstance().testFun(), 0);
}

总结

(1)未确保只能生成单例,需要对5原则进行处理。只有默认构造设置为default,其它构造函数设置为delete(c++11语法)。

(2)确保全局访问点,故需要设置static的类实例,同时声明静态获取类实例的方法。

(3)考虑线程安全,多线程竞争情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值