从头开始设计模式-工厂方法模式VS抽象工厂模式实现

时间:2020-04-02 22:30:48

标签: java design-patterns

我正在尝试从Head First Design patterns book学习Factory模式。该书说工厂模式有两种类型-工厂方法和抽象工厂

为什么模式中的代码实现方式不同? 我不是要问模式之间的区别,因为已经回答了。请进一步阅读。

这本书使用Pizza and PizzaStore示例来说明这种模式。我们有一个PizzaStore依赖于Pizza对象。我们必须开发一种通用的PizzaStore软件,该软件可以使人们订购比萨饼。披萨订购的逻辑过程或步骤保持不变-create(String pizzaType),prepare()或setupIngredients(),cut(),box()等。create()方法属于PizzaStore,其他方法属于Pizza 。

在进行该项目时,我们必须经常添加新型的披萨。但是,我们不想每次添加新的Pizza时都不断更改通用的PizzaStore代码。毕竟,比萨的制作和订购过程始终具有相同的逻辑步骤。

对于两种类型的工厂,本书都有单独的代码。例如,下面的Pizza类在工厂方法中仅具有名称,面团,调味料等的String成员。但是在抽象工厂中,它具有面团,调味料等的类。

为什么Pizza在两种模式中不能具有相同类型的成员?在工厂方法中,我们只能使用一种Dough实例而不是String生面团。在抽象工厂中,我们可以有任意数量的Dough实例。我不明白这种不一致的原因。示例是否需要这种不一致?

工厂方法-披萨:

public abstract class Pizza {
    String name;
    String dough;
    String sauce;
    ArrayList<String> toppings = new ArrayList<String>();

    public void prepare() {
        System.out.println("Prepare " + name);
        System.out.println("Tossing dough...");
        System.out.println("Adding sauce...");
        System.out.println("Adding toppings: ");
        for (String topping : toppings) {
            System.out.println("   " + topping);
        }
    }

    public void bake() {System.out.println("Bake for 25 minutes at 350");}

    public void cut() {System.out.println("Cut the pizza into diagonal slices");}

    public void box() {System.out.println("Place pizza in official PizzaStore box");}

}

抽象工厂-披萨:

public abstract class Pizza {
    String name;

    Dough dough;
    Sauce sauce;
    Veggies veggies[];
    Cheese cheese;
    Pepperoni pepperoni;
    Clams clam;

    public abstract void prepare();//Prepares the Dough, Sauce, Cheese etc.

    public void bake() {System.out.println("Bake for 25 minutes at 350");}

    public void cut() {System.out.println("Cutting the pizza into diagonal slices");}

    public void box() {System.out.println("Place pizza in official PizzaStore box");}

}

图:

工厂方法类图:

Factory method class diagram

抽象工厂类图:

Abstract factory class diagram

0 个答案:

没有答案
相关问题