在C++中,設計模式是一套被廣泛認可的解決特定編程問題的最佳實踐。這些模式可以幫助開發者構建靈活、可維護和可重用的代碼。以下是一些最常見的設計模式及其在C++中的應用:
1. 單例模式(Singleton)
概念:確保一個類只有一個實例,并提供一個全局訪問點。
原理:使用私有構造函數和靜態實例變量。
用法:通常用于管理共享資源,如配置信息、線程池等。
案例代碼:
class Singleton {
private:
static Singleton* instance;
Singleton() {}
public:
static Singleton* getInstance() {
if (instance == nullptr) {
instance = new Singleton();
}
return instance;
}
};
Singleton* Singleton::instance = nullptr;
int main() {
Singleton* s1 = Singleton::getInstance();
Singleton* s2 = Singleton::getInstance();
assert(s1 == s2); // 確保是同一個實例
return 0;
}
2. 工廠模式(Factory Method)
概念:定義一個創建對象的接口,但讓子類決定實例化哪個類。
原理:使用多態來創建對象。
用法:用于代碼中需要生成一系列相關或依賴對象的場景。
案例代碼:
class Product {
public:
virtual void use() = 0;
};
class ConcreteProductA : public Product {
public:
void use() override {
cout << "Using A" << endl;
}
};
class ConcreteProductB : public Product {
public:
void use() override {
cout << "Using B" << endl;
}
};
class Factory {
public:
virtual Product* createProduct() = 0;
};
class ConcreteFactoryA : public Factory {
public:
Product* createProduct() override {
return new ConcreteProductA();
}
};
class ConcreteFactoryB : public Factory {
public:
Product* createProduct() override {
return new ConcreteProductB();
}
};
int main() {
Factory* factory = new ConcreteFactoryA();
Product* product = factory->createProduct();
product->use(); // 使用A
delete product;
delete factory;
return 0;
}
3. 觀察者模式(Observer)
概念:定義對象間的一種一對多的依賴關系,當一個對象改變狀態時,所有依賴于它的對象都得到通知并自動更新。
原理:使用回調函數或事件。
用法:用于實現數據和視圖之間的同步,如模型-視圖-控制器(MVC)架構。
案例代碼:
#include <list>
#include <algorithm>
class Observer {
public:
virtual void update() = 0;
};
class Subject {
private:
std::list<Observer*> observers;
public:
void attach(Observer* observer) {
observers.push_back(observer);
}
void detach(Observer* observer) {
observers.remove(observer);
}
void notify() {
for (auto observer : observers) {
observer->update();
}
}
};
class ConcreteObserver : public Observer {
public:
void update() override {
cout << "Observer updated" << endl;
}
};
int main() {
Subject subject;
ConcreteObserver observer;
subject.attach(&observer);
subject.notify(); // 通知所有觀察者
subject.detach(&observer);
return 0;
}
4. 策略模式(Strategy)
概念:定義一系列算法,將每個算法封裝起來,并使它們可以互換使用。
原理:使用多態來動態選擇算法。
用法:用于需要動態改變算法或行為的場景。
案例代碼:
class Context {
public:
virtual void executeStrategy() = 0;
};
class ConcreteStrategyA : public Context {
public:
void executeStrategy() override {
cout << "Executing Strategy A" << endl;
}
};
class ConcreteStrategyB : public Context {
public:
void executeStrategy() override {
cout << "Executing Strategy B" << endl;
}
};
class Strategy {
public:
virtual void algorithm() = 0;
};
class ContextClient {
private:
Strategy* strategy;
public:
void setStrategy(Strategy* strategy) {
this->strategy = strategy;
}
void executeStrategy() {
strategy->executeStrategy();
}
};
int main() {
ContextClient client;
client.setStrategy(new ConcreteStrategyA());
client.executeStrategy(); // 執行策略A
client.setStrategy(new ConcreteStrategyB());
client.executeStrategy(); // 執行策略B
return 0;
}
這些設計模式提供了一套通用的解決方案,可以幫助開發者解決特定的編程問題,并提高代碼的可維護性和可擴展性。在實際開發中,根據具體需求選擇合適的設計模式是非常重要的。
浙公網安備 33010602011771號