设计模式: 单例模式
目录
- 单例模式
- 应用场景
- 实现步骤
- 涉及知识点
- 设计与实现
单例模式
通过单例模式的方法创建的类在当前进程中只有一个实例;
应用场景
配置管理
日志记录
线程池
连接池
内存池
对象池
消息队列
实现步骤
将类的构造方法定义为私有方法
定义一个私有的静态实例
提供一个公有的获取实例的静态方法
涉及知识点
static静态成员数据
static静态成员函数
template模板类
friend友元类
设计与实现
常用实现
模板实现
线程安全
main.c
#include"Singleton.h"
using namespace mySingleTon;
void test() {//A::instance()->show();//B::instance()->show();singleTon<A>::instance()->show();singleTon<B>::instance()->show();
}
A.h
//#pragma once
//#include<string>
//#include<iostream>
//using namespace std;
//
//class A {
//
//public:
// static A* instance() {
// if (m_instance == nullptr) {
// m_instance = new A();
// }
// return m_instance;
// }
// void show() {
// cout << mName << endl;
// }
//private:
// A():mName("A"){}
// A(const A&);
// ~A();
// A & operator=(const A&);
//private:
// static A* m_instance;
// string mName;
//};
//A* A::m_instance = nullptr;
#pragma once
#include<string>
#include<iostream>
#include"Singleton.h"
using namespace std;class A {friend class mySingleTon::singleTon<A>;
public:void show() {cout << mName << endl;}
private:A():mName("A"){}A(const A&);~A();A & operator=(const A&);
private:static A* m_instance;string mName;
};
A* A::m_instance = nullptr;
B.h
/*
#pragma once
#include<string>
#include<iostream>
#include"Singleton.h"
using namespace std;class B {friend class mySingleTon::singleTon<B>;
public:static B* instance() {if (m_instance == nullptr) {m_instance = new A();}return m_instance;}void show() {cout << mName << endl;}
private:B() :mName("B") {}B(const B&);~B();B& operator=(const B&);
private:static B* m_instance;string mName;
};
B* B::m_instance = nullptr;
*/
#pragma once
#include<string>
#include<iostream>
#include"Singleton.h"
using namespace std;class B {friend class mySingleTon::singleTon<B>;
public:void show() {cout << mName << endl;}
private:B() :mName("B") {}B(const B&);~B();B& operator=(const B&);
private:static B* m_instance;string mName;
};
B* B::m_instance = nullptr;
懒汉式
多线程时,是线程不安全的
Singleton.h
#pragma once
namespace mySingleTon {
template<typename T>
class singleTon {
public:static T* instance() {if (m_instance == nullptr) {m_instance = new T();}return m_instance;}private:singleTon() {};singleTon(const singleTon&){}~singleTon(){}static T* m_instance;singleTon<T>& operator =(const singleTon<T>);};
template<typename T>
T* singleTon<T>::m_instance = nullptr;};
饿汉式
多线程时,是线程安全的
Singleton.h
#pragma once
namespace mySingleTon {
template<typename T>
class singleTon {
public:static T* instance() {if (m_instance == nullptr) {m_instance = new T();}return m_instance;}private:singleTon() {};singleTon(const singleTon&){}~singleTon(){}static T* m_instance;singleTon<T>& operator =(const singleTon<T>);};
template<typename T>
T* singleTon<T>::m_instance = new singleTon<T> ;
};