在 C++ 中,我們可以使用模板和工廠函數來實現依賴注入。這里是一個簡單的例子:
首先,定義一個接口 IService
和實現該接口的類 ServiceA
和 ServiceB
:
#include<iostream>
#include<memory>
// 定義接口
class IService {
public:
virtual void execute() = 0;
};
// 實現類 ServiceA
class ServiceA : public IService {
public:
void execute() override {
std::cout << "ServiceA is executing."<< std::endl;
}
};
// 實現類 ServiceB
class ServiceB : public IService {
public:
void execute() override {
std::cout << "ServiceB is executing."<< std::endl;
}
};
然后,創建一個工廠函數,根據輸入參數創建不同類型的服務對象:
std::unique_ptr<IService> createService(const std::string& serviceType) {
if (serviceType == "ServiceA") {
return std::make_unique<ServiceA>();
} else if (serviceType == "ServiceB") {
return std::make_unique<ServiceB>();
} else {
throw std::invalid_argument("Invalid service type.");
}
}
最后,通過依賴注入將服務對象傳遞給需要它的類:
class Client {
public:
explicit Client(std::unique_ptr<IService> service) : m_service(std::move(service)) {}
void doWork() {
m_service->execute();
}
private:
std::unique_ptr<IService> m_service;
};
在主函數中,我們可以根據需要選擇具體的服務類型,并將其注入到客戶端中:
int main() {
// 選擇具體的服務類型
std::string serviceType = "ServiceA";
// 使用工廠函數創建服務對象
auto service = createService(serviceType);
// 將服務對象注入到客戶端中
Client client(std::move(service));
// 客戶端執行操作
client.doWork();
return 0;
}
這樣,我們就實現了基于 C++ 的依賴注入。當需要更改具體的服務實現時,只需修改 main()
函數中的 serviceType
變量即可,而無需修改客戶端代碼。