C++ 设计模式与 SOLID 原则示例
在设计软件时,遵循良好的设计模式和原则是非常重要的。设计模式是一套被反复使用的、多数人认可的、经过分类编目的、代码设计经验的总结。而SOLID原则是一组指导软件设计时应该遵循的五个原则,它们可以帮助我们创建可维护、可扩展和可测试的代码。本文将通过C++语言的示例,展示如何将设计模式与SOLID原则结合起来,以实现一个简单的银行账户管理系统。
设计模式
单例模式(Singleton)
单例模式确保一个类只有一个实例,并提供一个全局访问点。在银行账户管理系统中,我们可以使用单例模式来管理数据库连接。
cpp
include
include
class Database {
private:
static Database instance;
static std::mutex mutex;
protected:
Database() {}
~Database() {}
public:
static Database getInstance() {
if (instance == nullptr) {
std::lock_guard lock(mutex);
if (instance == nullptr) {
instance = new Database();
}
}
return instance;
}
};
Database Database::instance = nullptr;
std::mutex Database::mutex;
int main() {
Database db1 = Database::getInstance();
Database db2 = Database::getInstance();
std::cout << "db1 and db2 are the same instance: " << (db1 == db2) << std::endl;
return 0;
}
工厂模式(Factory)
工厂模式用于创建对象,而不直接指定对象的具体类。在银行账户管理系统中,我们可以使用工厂模式来创建不同类型的账户。
cpp
include
include
class Account {
public:
virtual void deposit(double amount) = 0;
virtual void withdraw(double amount) = 0;
virtual ~Account() {}
};
class SavingsAccount : public Account {
public:
void deposit(double amount) override {
std::cout << "SavingsAccount: Deposited " << amount << std::endl;
}
void withdraw(double amount) override {
std::cout << "SavingsAccount: Withdrawn " << amount << std::endl;
}
};
class CheckingAccount : public Account {
public:
void deposit(double amount) override {
std::cout << "CheckingAccount: Deposited " << amount << std::endl;
}
void withdraw(double amount) override {
std::cout << "CheckingAccount: Withdrawn " << amount << std::endl;
}
};
class AccountFactory {
public:
static std::shared_ptr createAccount(const std::string& type) {
if (type == "savings") {
return std::make_shared();
} else if (type == "checking") {
return std::make_shared();
}
return nullptr;
}
};
int main() {
auto account = AccountFactory::createAccount("savings");
account->deposit(1000);
account->withdraw(500);
return 0;
}
SOLID 原则
单一职责原则(Single Responsibility Principle)
单一职责原则要求一个类只负责一项职责。以下是一个遵循单一职责原则的示例:
cpp
class Account {
public:
virtual void deposit(double amount) = 0;
virtual void withdraw(double amount) = 0;
virtual ~Account() {}
};
class SavingsAccount : public Account {
public:
void deposit(double amount) override {
// 实现存款逻辑
}
void withdraw(double amount) override {
// 实现取款逻辑
}
};
class CheckingAccount : public Account {
public:
void deposit(double amount) override {
// 实现存款逻辑
}
void withdraw(double amount) override {
// 实现取款逻辑
}
};
开放封闭原则(Open/Closed Principle)
开放封闭原则要求软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。以下是一个遵循开放封闭原则的示例:
cpp
class Account {
public:
virtual void deposit(double amount) = 0;
virtual void withdraw(double amount) = 0;
virtual ~Account() {}
};
class SavingsAccount : public Account {
public:
void deposit(double amount) override {
// 实现存款逻辑
}
void withdraw(double amount) override {
// 实现取款逻辑
}
};
class CheckingAccount : public Account {
public:
void deposit(double amount) override {
// 实现存款逻辑
}
void withdraw(double amount) override {
// 实现取款逻辑
}
};
依赖倒置原则(Dependency Inversion Principle)
依赖倒置原则要求高层模块不应该依赖于低层模块,两者都应该依赖于抽象。以下是一个遵循依赖倒置原则的示例:
cpp
class Account {
public:
virtual void deposit(double amount) = 0;
virtual void withdraw(double amount) = 0;
virtual ~Account() {}
};
class AccountManager {
public:
void addAccount(std::shared_ptr account) {
// 添加账户
}
void deposit(std::shared_ptr account, double amount) {
account->deposit(amount);
}
void withdraw(std::shared_ptr account, double amount) {
account->withdraw(amount);
}
};
接口隔离原则(Interface Segregation Principle)
接口隔离原则要求多个特定客户端接口,而不是单一宽泛接口。以下是一个遵循接口隔离原则的示例:
cpp
class Account {
public:
virtual void deposit(double amount) = 0;
virtual void withdraw(double amount) = 0;
virtual ~Account() {}
};
class SavingsAccount : public Account {
public:
void deposit(double amount) override {
// 实现存款逻辑
}
void withdraw(double amount) override {
// 实现取款逻辑
}
};
class CheckingAccount : public Account {
public:
void deposit(double amount) override {
// 实现存款逻辑
}
void withdraw(double amount) override {
// 实现取款逻辑
}
};
实现依赖倒置原则(Liskov Substitution Principle)
实现依赖倒置原则要求子类必须能够替换其基类。以下是一个遵循实现依赖倒置原则的示例:
cpp
class Account {
public:
virtual void deposit(double amount) = 0;
virtual void withdraw(double amount) = 0;
virtual ~Account() {}
};
class SavingsAccount : public Account {
public:
void deposit(double amount) override {
// 实现存款逻辑
}
void withdraw(double amount) override {
// 实现取款逻辑
}
};
class CheckingAccount : public Account {
public:
void deposit(double amount) override {
// 实现存款逻辑
}
void withdraw(double amount) override {
// 实现取款逻辑
}
};
总结
本文通过C++语言的示例,展示了如何将设计模式与SOLID原则结合起来,以实现一个简单的银行账户管理系统。遵循这些原则和模式可以帮助我们创建更加健壮、可维护和可扩展的代码。在实际项目中,我们应该根据具体需求灵活运用这些原则和模式。
Comments NOTHING