
设计模式是软件设计中常见问题的典型解决方案,是经过验证的、可重用的设计经验总结。它们不是可以直接转换为代码的完整设计,而是解决特定问题的模板或指导方针。
根据《设计模式:可复用面向对象软件的基础》(GoF)一书,设计模式分为三大类:
意图:确保一个类只有一个实例,并提供全局访问点。
C++实现:
Cpp
class Singleton {
public:
static Singleton& getInstance() {
static Singleton instance; // 线程安全(C++11起)
return instance;
}
// 删除拷贝构造函数和赋值运算符
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
private:
Singleton() {} // 私有构造函数
};应用场景:
意图:定义一个创建对象的接口,但让子类决定实例化哪个类。
C++实现:
Cpp
class Product {
public:
virtual ~Product() {}
virtual void operation() = 0;
};
class ConcreteProductA : public Product {
public:
void operation() override {
std::cout << "ConcreteProductA operation\n";
}
};
class Creator {
public:
virtual ~Creator() {}
virtual Product* createProduct() = 0;
void someOperation() {
Product* product = createProduct();
product->operation();
delete product;
}
};
class ConcreteCreatorA : public Creator {
public:
Product* createProduct() override {
return new ConcreteProductA();
}
};应用场景:
意图:提供一个接口,用于创建相关或依赖对象的家族,而不需要指定具体类。
C++实现:
Cpp
class AbstractProductA {
public:
virtual ~AbstractProductA() {}
virtual void operationA() = 0;
};
class ProductA1 : public AbstractProductA {
public:
void operationA() override {
std::cout << "ProductA1 operation\n";
}
};
class AbstractProductB {
public:
virtual ~AbstractProductB() {}
virtual void operationB() = 0;
};
class ProductB1 : public AbstractProductB {
public:
void operationB() override {
std::cout << "ProductB1 operation\n";
}
};
class AbstractFactory {
public:
virtual ~AbstractFactory() {}
virtual AbstractProductA* createProductA() = 0;
virtual AbstractProductB* createProductB() = 0;
};
class ConcreteFactory1 : public AbstractFactory {
public:
AbstractProductA* createProductA() override {
return new ProductA1();
}
AbstractProductB* createProductB() override {
return new ProductB1();
}
};应用场景:
意图:将一个类的接口转换成客户希望的另一个接口。
C++实现:
Cpp
class Target {
public:
virtual ~Target() {}
virtual void request() = 0;
};
class Adaptee {
public:
void specificRequest() {
std::cout << "Adaptee specific request\n";
}
};
class Adapter : public Target {
private:
Adaptee* adaptee;
public:
Adapter(Adaptee* a) : adaptee(a) {}
void request() override {
adaptee->specificRequest();
}
};应用场景:
意图:动态地给一个对象添加一些额外的职责。
C++实现:
Cpp
class Component {
public:
virtual ~Component() {}
virtual void operation() = 0;
};
class ConcreteComponent : public Component {
public:
void operation() override {
std::cout << "ConcreteComponent operation\n";
}
};
class Decorator : public Component {
protected:
Component* component;
public:
Decorator(Component* c) : component(c) {}
void operation() override {
if (component) {
component->operation();
}
}
};
class ConcreteDecoratorA : public Decorator {
public:
ConcreteDecoratorA(Component* c) : Decorator(c) {}
void operation() override {
Decorator::operation();
addedBehavior();
}
void addedBehavior() {
std::cout << "Added behavior from ConcreteDecoratorA\n";
}
};应用场景:
意图:定义对象间的一种一对多的依赖关系,当一个对象状态改变时,所有依赖它的对象都得到通知并自动更新。
C++实现:
Cpp
#include <vector>
#include <algorithm>
class Observer {
public:
virtual ~Observer() {}
virtual void update(int value) = 0;
};
class Subject {
private:
std::vector<Observer*> observers;
int state;
public:
void attach(Observer* observer) {
observers.push_back(observer);
}
void detach(Observer* observer) {
observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());
}
void notify() {
for (Observer* observer : observers) {
observer->update(state);
}
}
void setState(int value) {
state = value;
notify();
}
};
class ConcreteObserver : public Observer {
public:
void update(int value) override {
std::cout << "Observer received update: " << value << "\n";
}
};应用场景:
意图:定义一系列算法,将每个算法封装起来,并使它们可以互相替换。
C++实现:
Cpp
class Strategy {
public:
virtual ~Strategy() {}
virtual void execute() = 0;
};
class ConcreteStrategyA : public Strategy {
public:
void execute() override {
std::cout << "Executing strategy A\n";
}
};
class Context {
private:
Strategy* strategy;
public:
Context(Strategy* s) : strategy(s) {}
void setStrategy(Strategy* s) {
strategy = s;
}
void executeStrategy() {
strategy->execute();
}
};应用场景:
Cpp
#include <memory>
class ModernSingleton {
public:
static ModernSingleton& getInstance() {
static ModernSingleton instance;
return instance;
}
ModernSingleton(const ModernSingleton&) = delete;
ModernSingleton& operator=(const ModernSingleton&) = delete;
private:
ModernSingleton() = default;
};
class ModernProduct {
public:
virtual ~ModernProduct() = default;
virtual void operation() = 0;
};
using ProductPtr = std::unique_ptr<ModernProduct>;Cpp
class ModernStrategy {
public:
using StrategyFunc = std::function<void()>;
void setStrategy(StrategyFunc func) {
strategyFunc = func;
}
void execute() {
if (strategyFunc) {
strategyFunc();
}
}
private:
StrategyFunc strategyFunc;
};Cpp
template <typename T>
class GenericSingleton {
public:
static T& getInstance() {
static T instance;
return instance;
}
GenericSingleton(const GenericSingleton&) = delete;
GenericSingleton& operator=(const GenericSingleton&) = delete;
protected:
GenericSingleton() = default;
};案例:游戏角色创建系统
案例:交易处理系统
设计模式是软件架构师的必备工具,但切记它们是手段而非目的。在C++开发中,结合现代C++特性,可以更优雅地实现各种设计模式。掌握设计模式的本质思想比记住具体实现更为重要,灵活运用才能设计出高质量、可维护的软件系统。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。