设计模式
目的
实现可重用解决方案,构筑易维护、可扩展的软件系统。
六大原则
单一职责: 类的职责单一,一个方法做一件事。
开闭原则: 拓展开放,修改关闭。
里氏替换: 父类能出现的地方,子类可以替换。子类必须全部实现父类方法,尽量不暴露自己public
方法供外界使用。覆盖或实现父类方法时,输入参数可以多。
依赖倒置: 模块之间的依赖通过抽象发生,具体类之间不依赖。每个类尽量有抽象类,任何类不应该从具体类派生,尽量不重写基类方法。
迪米特法则: 尽量减少对象间交互,从而减少类间耦合。
接口隔离原则: 类间的依赖关系建立在最小的接口上。
抽象构建框架,实现拓展细节。
单例模式
一个类只有一个对象,及系统中只有一个实例,实例被所有程序模块共享。
例如服务器配置信息放在一个文件中,配置数据由单例对象统一读取,服务进程的其他对象通过单例对象获取配置信息。
实现
有饿汉模式和懒汉模式两种实现模式。
饿汉模式
程序启动就创建唯一实例对象。
多线程获取单例对象不需要加锁。
#include <iostream>
#include <string>
class Singleton {
private:
// 私有构造函数,防止外部创建实例
Singleton() : data("Singleton") {
std::cout << "Singleton instance created!" << std::endl;
}
// 私有析构函数,防止外部删除实例
~Singleton() {}
// 删除拷贝构造函数和赋值运算符
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
// 静态成员变量,类加载时初始化
static Singleton instance;
// 成员变量
std::string data;
public:
// 获取单例对象的静态方法
static Singleton& getInstance() {
return instance;
}
// 获取成员变量的方法
std::string& getData() {
return data;
}
};
// 在类外初始化静态成员变量
Singleton Singleton::instance;
int main() {
// 获取单例对象
Singleton& singleton = Singleton::getInstance();
// 访问单例对象的成员变量
std::cout << "Data: " << singleton.getData() << std::endl;
// 再次获取单例对象,验证是否为同一个实例
Singleton& singleton2 = Singleton::getInstance();
if (&singleton == &singleton2) {
std::cout << "Both references point to the same instance!" << std::endl;
}
return 0;
}
懒汉模式
如果单例对象构造特别耗时或者耗资(加载插件、网络),可在第一次使用时才创建对象。
C++11
之后,局部静态变量的初始化是线程安全的,因此可以直接使用局部静态变量实现懒汉模式。
#include <iostream>
#include <string>
class Singleton {
private:
// 私有构造函数,防止外部创建实例
Singleton() : data("Singleton") {
std::cout << "Singleton instance created!" << std::endl;
}
// 私有析构函数,防止外部删除实例
~Singleton() {}
// 删除拷贝构造函数和赋值运算符
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
// 成员变量
std::string data;
public:
// 获取单例对象的静态方法
static Singleton& getInstance() {
static Singleton instance; // 局部静态变量,线程安全
return instance;
}
// 获取成员变量的方法
std::string& getData() {
return data;
}
};
int main() {
// 获取单例对象
Singleton& singleton = Singleton::getInstance();
// 访问单例对象的成员变量
std::cout << "Data: " << singleton.getData() << std::endl;
// 再次获取单例对象,验证是否为同一个实例
Singleton& singleton2 = Singleton::getInstance();
if (&singleton == &singleton2) {
std::cout << "Both references point to the same instance!" << std::endl;
}
return 0;
}
推荐一下
https://github.com/0voice