1. 设计模式在C++中的核心价值与实践意义
设计模式之于C++开发者,如同棋谱之于棋手——它记录了大量前人验证过的优秀解法。我在工业级C++项目中最深刻的体会是:恰当运用设计模式能让代码具备抗需求变更的韧性。特别是在框架设计和模块解耦场景中,工厂模式和单例模式的出现频率高达60%以上。
工厂模式解决的核心痛点是对象创建的复杂度管理。想象一个电商系统要支持多种支付方式(支付宝、微信、银联),直接new操作会导致支付逻辑与具体实现类强耦合。而单例模式则确保关键资源(如配置管理器、日志服务)全局唯一访问,避免重复创建带来的资源浪费。
重要提示:设计模式不是银弹,过度使用会导致代码过度设计。我的经验法则是——当发现同一类修改在多个地方重复出现三次以上,才考虑引入模式重构。
2. 工厂模式的三重境界与实战演化
2.1 简单工厂:快速实现的对象创建代理
简单工厂是最易上手的模式,通过一个静态方法封装对象创建逻辑。下面是一个图形绘制工具的典型实现:
cpp复制class Shape {
public:
virtual void draw() = 0;
};
class Circle : public Shape { /*...*/ };
class Rectangle : public Shape { /*...*/ };
class ShapeFactory {
public:
static Shape* create(const string& type) {
if(type == "circle") return new Circle();
if(type == "rectangle") return new Rectangle();
throw runtime_error("Unsupported shape type");
}
};
这种方式的优势在于客户端完全不用关心具体类的构造细节。我在早期项目中使用时发现两个典型问题:
- 新增类型需要修改工厂类,违反开闭原则
- 类型判断逻辑集中会导致工厂方法膨胀
2.2 工厂方法:多态工厂的优雅实现
工厂方法模式通过抽象创建接口解决了简单工厂的扩展性问题。以数据库连接为例:
cpp复制class IDBConnection {
public:
virtual void connect() = 0;
};
class MySQLConnection : public IDBConnection { /*...*/ };
class OracleConnection : public IDBConnection { /*...*/ };
class IDBFactory {
public:
virtual unique_ptr<IDBConnection> createConnection() = 0;
};
class MySQLFactory : public IDBFactory {
public:
unique_ptr<IDBConnection> createConnection() override {
