单例模式
定义:
确保一个类只有一个实例,并提供全局访问点来访问这个实例
优点:
(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)考虑线程安全,多线程竞争情况。