一、单例模式(Singleton Pattern)
核心思想:确保一个类只有一个实例,并提供全局访问点。
适用场景:需要全局唯一对象的场景,如配置管理、数据库连接池、日志管理器等。
实现方式:
- 私有构造函数:禁止外部直接实例化。
- 静态成员变量:保存唯一实例。
- 静态方法(如getInstance):提供全局访问入口。
代码示例(线程安全懒汉式,C++):
class Singleton {
private:
static Singleton* instance;
Singleton() {} // 私有构造函数
public:
static Singleton* getInstance() {
if (instance == nullptr) {
instance = new Singleton();
}
return instance;
}
};
优缺点:
- ✅ 节省资源,避免重复创建对象。
- ❌ 可能引入全局状态,需注意线程安全。
二、工厂模式(Factory Pattern)
核心思想:将对象的创建逻辑封装在工厂类中,客户端无需关心具体实现。
常见变体:
- 简单工厂:一个工厂类根据参数创建不同对象。
- 工厂方法:定义创建对象的接口,由子类决定实例化哪个类。
- 抽象工厂:创建一组相关或依赖对象的家族。
适用场景:需要解耦对象创建和使用时,如数据库驱动、UI 组件库等。
代码示例:
#include <iostream>
#include <string>
using namespace std;
// 基类(抽象接口)
class Animal {
public:
virtual string speak() = 0;
virtual ~Animal() = default; // 虚析构函数
};
// 派生类 Dog
class Dog : public Animal {
public:
string speak() override { return "Woof!"; }
};
// 派生类 Cat
class Cat : public Animal {
public:
string speak() override { return "Meow!"; }
};
// 工厂类
class AnimalFactory {
public:
static Animal* create(const string& type) {
if (type == "dog") return new Dog();
if (type == "cat") return new Cat();
}
};
// 使用示例
int main() {
Animal* dog = AnimalFactory::create("dog");
Animal* cat = AnimalFactory::create("cat");
cout << dog->speak() << "\n"; // 输出: Woof!
cout << cat->speak() << "\n"; // 输出: Meow!
delete dog; // 实际建议用智能指针
delete cat;
return 0;
}
优缺点:
- ✅ 客户端与具体类解耦,扩展性强。
- ❌ 新增类型需修改工厂逻辑(可通过反射优化)。
三、观察者模式(Observer Pattern)
核心思想:定义对象间的一对多依赖关系,当一个对象(主题)状态变化时,自动通知所有依赖它的观察者。
适用场景:事件驱动系统、GUI 组件交互、消息通知等。
关键角色:
- Subject(主题):维护观察者列表,提供注册/注销接口。
- Observer(观察者):定义更新方法(如update)。
代码示例:
#include <iostream>
#include <vector>
using namespace std;
// 主题(被观察者)
class Subject {
public:
vector<class Observer*> observers; // 直接公开观察者列表(简化版)
void notify(const string& msg) {
for (auto* o : observers) o->update(msg); // 直接调用观察者的 update
}
};
// 观察者
class Observer {
public:
virtual void update(const string& msg) = 0;
};
// 具体观察者
class User : public Observer {
public:
void update(const string& msg) override {
cout << "[User] " << msg << "\n";
}
};
// 使用示例
int main() {
Subject subject;
User user1, user2;
subject.observers.push_back(&user1); // 直接添加观察者(省去 addObserver 方法)
subject.observers.push_back(&user2);
subject.notify("Hello!");
}
output:
[User] Hello!
[User] Hello!
优缺点:
- ✅ 松耦合,主题和观察者独立变化。
- ❌ 观察者过多时可能影响性能。
总结
模式 | 核心目标 | 典型场景 |
单例模式 | 控制实例数量 | 全局配置、资源共享 |
工厂模式 | 封装对象创建 | 动态创建对象、解耦客户端与实现 |
观察者模式 | 实现对象间动态通知机制 | 事件处理、实时数据更新 |