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();
这种写法存在几个明显问题:
- 违反了"针对接口编程,而非实现编程"的原则
- 当需要新增或修改具体类时,必须修改多处代码
- 创建逻辑分散在各处,难以统一管理
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
