gpt4 book ai didi

java - 工厂方法是否违反了依赖倒置原则?

转载 作者:行者123 更新时间:2023-11-29 09:14:26 24 4
gpt4 key购买 nike

public class DependentPizzaStore {
public Pizza createPizza(String type) {
Pizza pizza = null;
if (Style.equals("NY")) {
if (type.equals("cheese")) {
pizza = new NYStyleCheesePizza();
}
else if(type.equals("Veggie")){
pizza = new NYStyleVeggiePizza();
}
}

pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
}

Headfirst Design Patterns 中的这个示例违反了“依赖倒置原则”,即“依赖于抽象。不依赖于具体类”。

上面的例子违反了规则,因为 DependentPizzaStore(高级组件)依赖于比萨饼(低级组件)的具体实现。

为了解决这个问题,我们使用工厂方法模式。

public abstract class PizzaStore {
protected abstract Pizza createPizza(String item);
public Pizza orderPizza(String type) {
Pizza pizza = createPizza(type);
System.out.println("--- Making a " + pizza.getName() + " ---");
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}

public class NYPizzaStore extends PizzaStore {
protected Pizza createPizza(String item) {
Pizza pizza = null;
if (item.equals("cheese")) {
pizza = new CheesePizza();
} else if (item.equals("veggie")) {
pizza = new VeggiePizza();
}
return pizza;
}
}

现在 PizzaStore(高级组件)仅依赖于 Pizza 具体类的 Pizza 抽象,而具体 Pizza 也依赖于 pizza 抽象,因为它们扩展了它。

我的问题是:NYPizzaStore 类是否也违反了“依赖倒置原则”,因为它依赖于 CheesePizza() 和 VeggiePizza(),它们是 Pizza 的具体实现。

最佳答案

据我所知,DIP 适用于您的主程序部分。你一定想知道:

破坏我的目标的代码在哪里?

在您的例子中,您的目标是允许在遵循一些规则的同时制作披萨,而不依赖于您所制作的披萨的知识。

因此,DIP 应该应用于您的 PizzaStore 类。但是,您用于实现此目标的所有类都只是某种“插件”,因此,没有强制性需要使用 DIP。

的确,在所有类型的程序中,必须至少有一个地方用于包含具体类的简单系列 if/else,否则您永远无法完成成品。即使是最完美的代码也不可能达到 100% 的“抽象”。

关于java - 工厂方法是否违反了依赖倒置原则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10375830/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com