那么这里博主先安利一些干货满满的专栏了!
首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。
高质量干货博客汇总https://blog.csdn.net/yu_cblog/category_12379430.html?spm=1001.2014.3001.5482
一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全 局访问点,该实例被所有程序模块共享。比如在某个服务器程序中,该服务器的配置信息存放在一个文件 中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置 信息,这种方式简化了在复杂环境下的配置管理。
单例模式有两种实现方式:
就是说不管你将来用不用,程序启动时就创建一个唯一的实例对象。
优点:
缺点:
//设计只能创建一个对象的类(单例模式)
//有两种设计方案
//饿汉模式 -- 一开始(main())之前就创建出对象了
#if 1
class MemoryPool //假设要求设计一个内存池 -- 要求是单例的 ,当然只是名字而已,我们不是真的实现内存池
{
public:
static MemoryPool* GetInstance()
{
return _pinst;
}
void* Alloc(size_t n)
{
void* ptr = nullptr;
//...
//里面啥东西我们不管
return ptr;
}
void Dealloc(void* ptr)
{
//...
}
protected:
char* _ptr = nullptr;
protected:
//构造函数私有
MemoryPool() {}
//两种写法,这里只写了一种,写成指针也可以,不写成指针也可以
static MemoryPool* _pinst;//声明
};
MemoryPool* MemoryPool::_pinst = new MemoryPool;
#define MemoryPoolObject MemoryPool::GetInstance()
int main()
{
//一般是这样调用的,直接调就行
void* ptr1 = MemoryPool::GetInstance()->Alloc(10);
MemoryPool::GetInstance()->Dealloc(ptr1);
//单例模式一般就是通过这个 MemoryPool::GetInstance() 去找到这个已经创建好的对象,去调它里面的东西
void* ptr2 = MemoryPoolObject->Alloc(29);
MemoryPoolObject->Dealloc(ptr2);
return 0;
}
#endif
对象第一次使用的时候再创建。
优点:
缺点:
//懒汉模式
//对象第一次使用的时候再创建
class MemoryPool //假设要求设计一个内存池 -- 要求是单例的 ,当然只是名字而已,我们不是真的实现内存池
{
public:
static MemoryPool* GetInstance()
{
//如果发现指针是nullptr的时候,说明我们是第一次使用这个类
if (_pinst == nullptr)
{
//第一次创建
cout << "第一次创建对象" << endl;
_pinst = new MemoryPool;
}
return _pinst;
}
void* Alloc(size_t n)
{
void* ptr = nullptr;
//...
//里面啥东西我们不管
return ptr;
}
void Dealloc(void* ptr)
{
//...
}
class CGarbo
{
public:
~CGarbo()
{
if (_pinst)delete _pinst;
}
};
protected:
char* _ptr = nullptr;
protected:
//构造函数私有
MemoryPool() {}
//两种写法,这里只写了一种,写成指针也可以,不写成指针也可以
static MemoryPool* _pinst;//声明
};
MemoryPool* MemoryPool::_pinst = nullptr;
//回收对象
//在main结束之后,它会调用析构函数,就会释放单例对象
static MemoryPool::CGarbo gc;
#define MemoryPoolObject MemoryPool::GetInstance()
int main()
{
//一般是这样调用的,直接调就行
cout << " -------- 第一次使用 -------- " << endl;
void* ptr1 = MemoryPool::GetInstance()->Alloc(10);
MemoryPool::GetInstance()->Dealloc(ptr1);
//单例模式一般就是通过这个 MemoryPool::GetInstance() 去找到这个已经创建好的对象,去调它里面的东西
cout << " -------- 第二次使用 -------- " << endl;
void* ptr2 = MemoryPoolObject->Alloc(29);
MemoryPoolObject->Dealloc(ptr2);
return 0;
}