在 C++ 中,我們可以使用模板和工廠函數(shù)來實(shí)現(xiàn)依賴注入。這里是一個(gè)簡單的例子:
首先,定義一個(gè)接口 IService
和實(shí)現(xiàn)該接口的類 ServiceA
和 ServiceB
:
#include<iostream>
#include<memory>
// 定義接口
class IService {
public:
virtual void execute() = 0;
};
// 實(shí)現(xiàn)類 ServiceA
class ServiceA : public IService {
public:
void execute() override {
std::cout << "ServiceA is executing."<< std::endl;
}
};
// 實(shí)現(xiàn)類 ServiceB
class ServiceB : public IService {
public:
void execute() override {
std::cout << "ServiceB is executing."<< std::endl;
}
};
然后,創(chuàng)建一個(gè)工廠函數(shù),根據(jù)輸入?yún)?shù)創(chuàng)建不同類型的服務(wù)對(duì)象:
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.");
}
}
最后,通過依賴注入將服務(wù)對(duì)象傳遞給需要它的類:
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;
};
在主函數(shù)中,我們可以根據(jù)需要選擇具體的服務(wù)類型,并將其注入到客戶端中:
int main() {
// 選擇具體的服務(wù)類型
std::string serviceType = "ServiceA";
// 使用工廠函數(shù)創(chuàng)建服務(wù)對(duì)象
auto service = createService(serviceType);
// 將服務(wù)對(duì)象注入到客戶端中
Client client(std::move(service));
// 客戶端執(zhí)行操作
client.doWork();
return 0;
}
這樣,我們就實(shí)現(xiàn)了基于 C++ 的依賴注入。當(dāng)需要更改具體的服務(wù)實(shí)現(xiàn)時(shí),只需修改 main()
函數(shù)中的 serviceType
變量即可,而無需修改客戶端代碼。