一.设计模式大概谈
“设计模式”:代码的一些写法(这些写法跟常规写法不怎么一样):程序灵活,维护起来可能很方便,但是别人接管、阅读代码都会很痛苦。
用“设计模式”理念写出的代码很晦涩的。《head first》讲设计模式,可以了解一下。
老外为应付特别大的项目的时候,把项目的开发经验、模块划分经验,总结整理成设计模式(先有开发需求,后又理论总结和整理)
设计模式拿到中国来,不太一样,拿着一个程序(项目)往设计模式上套,一个小小的项目它非要弄几个设计模式进去,本末倒置。
设计模式肯定有它独特的优点,要活学活用,不要深陷其中,生搬硬套。
二.单例设计模式
使用频率比较高。
单例:整个项目中,某个或者某些特殊的类,属于该类的对象,只能创建一个,多了创建不了。
建议:一般在主线程中先实例出一个对象,之后在子线程中可以去使用这个对象,若在子线程中取实例,容易出现线程不安全的情况。
单例模式分类:
- 懒汉式:指系统运行中,实例并不存在,只有当需要使用该实例时,才会去创建并使用实例。(这种方式要考虑线程安全)
- 饿汉式:指系统一运行,就初始化创建实例,当需要时,直接调用即可。(本身就线程安全,没有多线程的问题)
1.普通懒汉式单例(线程不安全)
注意类中套类的写法,来释放掉创建的实例。
#include <bits/stdc++.h>
#include <thread>
#include <mutex>
using namespace std;
class Singleton{
private:
Singleton(){
}//私有化构造函数
//进制外部拷贝和赋值
Singleton(const Singleton&);
Singleton operator=(Singleton&);
static Singleton *m_instance; //静态成员变量
public:
static Singleton* getInstance(){
if(m_instance == nullptr){
m_instance = new Singleton(); // 没有加锁是线程不安全的,当线程并发时会创建多个实例
static deleteInstance c1; //这是静态成员,当程序结束的时候,会调用该对象的析构函数。
}
return m_instance;
}
/*
//需要手动释放
void deleteInstance(){
if(m_instance){
delete m_instance;
m_instance = nullptr;
}
}
*/
class deleteInstance{
//类中套类,用来释放对象。不需要手动释放
public:
~deleteInstance(){
if(Singleton::m_instance){
delete Singleton::m_instance;
Singleton::m_instance = nullptr;
}
}
};
void func(){
cout<<"测试"<<endl;
}
};
//类静态变量初始化
Singleton* Singleton::m_instance = nullptr;
int main(){
Singleton* p = Singleton::getInstance();
p->func();
return 0;
}
2.加锁的懒汉式单例(线程安全)
使用了双检锁,提高效率。