C++工厂模式实践:从披萨店案例看对象创建解耦

1. 工厂模式入门:从披萨店看对象创建的艺术

作为一名C++开发者,我经常遇到需要创建对象但又不想让代码过度依赖具体类的情况。最近在重读《Head First设计模式》时,工厂模式给了我很大启发。与Java版本不同,我用C++重新实现了书中的示例,发现了很多值得分享的细节。

工厂模式的核心价值在于:将对象创建的逻辑封装起来,使代码更灵活、更易维护。想象一下,如果你是一家披萨连锁店的程序员,每次新增或下架一款披萨,都要修改所有调用new的地方,那将是场噩梦。而工厂模式正是为解决这类问题而生。

需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。

2. 为什么我们需要工厂模式?

2.1 直接new操作符的问题

在传统方式中,我们经常看到这样的代码:

cpp复制Duck* duck = new MallardDuck();

或者更复杂的条件创建:

cpp复制Duck* duck = nullptr;
if(picnic) duck = new MallardDuck();
else if(hunting) duck = new DecoyDuck();
else if(inBathTub) duck = new RubberDuck();

这种写法存在几个明显问题:

  1. 违反了"针对接口编程,而非实现编程"的原则
  2. 当需要新增或修改具体类时,必须修改多处代码
  3. 创建逻辑分散在各处,难以统一管理

2.2 披萨店的案例

让我们看一个更实际的例子 - 披萨店订单系统:

cpp复制Pizza* orderPizza(string type) {
    Pizza* pizza = nullptr;
    if (type == "cheese") pizza = new CheesePizza();
    else if (type == "greek") pizza = new GreekPizza();
    else if (type == "pepperoni") pizza = new PepperoniPizza();
    
    pizza->prepare();
    pizza->bake();
    pizza->cut();
    pizza->box();
    return pizza;
}

这段代码的问题在于:

  • 当披萨种类变化时,必须修改if-else逻辑
  • 创建逻辑与业务逻辑混杂在一起
  • 难以应对不同地区的风味差异

3. 简单工厂模式:封装创建逻辑

3.1 简单工厂的实现

解决上述问题的方法是将创建逻辑封装到一个专门的工厂类中:

cpp复制class SimplePizzaFactory {
public:
    Pizza* createPizza(string type) {
        Pizza* pizza = nullptr;
        if (type == "cheese") pizza = new CheesePizza();
        else if (type == "greek") pizza = new GreekPizza();
        else if (type

内容推荐

已经到底了哦
已经到底了哦