在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;
}
這些設計模式提供了一套通用的解決方案,可以幫助開發者解決特定的程式設計問題,並提高程式碼的可維護性和可擴充套件性。在實際開發中,根據具體需求選擇合適的設計模式是非常重要的。