2013-10-30 24 views
0

在書首頭設計模式,我不明白爲什麼類PizzaTestDrive創建類SimplePizzaFactory的對象。爲什麼類PizzaStore不創建自己的對象?工廠模式頭先

public class PizzaTestDrive { 

    public static void main(String[] args) { 
     SimplePizzaFactory factory = new SimplePizzaFactory(); 
     PizzaStore store = new PizzaStore(factory); 

     Pizza pizza = store.orderPizza("cheese"); 
     System.out.println("We ordered a " + pizza.getName() + "\n"); 

     pizza = store.orderPizza("veggie"); 
     System.out.println("We ordered a " + pizza.getName() + "\n"); 
    } 
} 

public class PizzaStore { 
    SimplePizzaFactory factory; 

    public PizzaStore(SimplePizzaFactory factory) { 
     this.factory = factory; 
    } 

    public Pizza orderPizza(String type) { 
     Pizza pizza; 

     pizza = factory.createPizza(type); 

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

     return pizza; 
    } 

} 

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

    public String getName() { 
     return name; 
    } 

    public void prepare() { 
     System.out.println("Preparing " + name); 
    } 

    public void bake() { 
     System.out.println("Baking " + name); 
    } 

    public void cut() { 
     System.out.println("Cutting " + name); 
    } 

    public void box() { 
     System.out.println("Boxing " + name); 
    } 

    public String toString() { 
     // code to display pizza name and ingredients 
     StringBuffer display = new StringBuffer(); 
     display.append("---- " + name + " ----\n"); 
     display.append(dough + "\n"); 
     display.append(sauce + "\n"); 
     for (int i = 0; i < toppings.size(); i++) { 
      display.append((String)toppings.get(i) + "\n"); 
     } 
     return display.toString(); 
    } 
} 

public class SimplePizzaFactory { 

    public Pizza createPizza(String type) { 
     Pizza pizza = null; 

     if (type.equals("cheese")) { 
      pizza = new CheesePizza(); 
     } else if (type.equals("pepperoni")) { 
      pizza = new PepperoniPizza(); 
     } else if (type.equals("clam")) { 
      pizza = new ClamPizza(); 
     } else if (type.equals("veggie")) { 
      pizza = new VeggiePizza(); 
     } 
     return pizza; 
    } 
} 

public class CheesePizza extends Pizza { 
    public CheesePizza() { 
     name = "Cheese Pizza"; 
     dough = "Regular Crust"; 
     sauce = "Marinara Pizza Sauce"; 
     toppings.add("Fresh Mozzarella"); 
     toppings.add("Parmesan"); 
    } 
} 

public class ClamPizza extends Pizza { 
    public ClamPizza() { 
     name = "Clam Pizza"; 
     dough = "Thin crust"; 
     sauce = "White garlic sauce"; 
     toppings.add("Clams"); 
     toppings.add("Grated parmesan cheese"); 
    } 
} 


public class PepperoniPizza extends Pizza { 
    public PepperoniPizza() { 
     name = "Pepperoni Pizza"; 
     dough = "Crust"; 
     sauce = "Marinara sauce"; 
     toppings.add("Sliced Pepperoni"); 
     toppings.add("Sliced Onion"); 
     toppings.add("Grated parmesan cheese"); 
    } 
} 


public class VeggiePizza extends Pizza { 
    public VeggiePizza() { 
     name = "Veggie Pizza"; 
     dough = "Crust"; 
     sauce = "Marinara sauce"; 
     toppings.add("Shredded mozzarella"); 
     toppings.add("Grated parmesan"); 
     toppings.add("Diced onion"); 
     toppings.add("Sliced mushrooms"); 
     toppings.add("Sliced red pepper"); 
     toppings.add("Sliced black olives"); 
    } 
} 

班披薩準備比薩餅。 SimplePizzaFactory選擇將要製作的披薩。 PizzaStore將披薩賣給客戶。 PizzaTestDrive是客戶端。

回答

4

因爲作者選擇這樣設計它。

你可能會看到它是一家比薩店,從工廠獲得冷凍比薩餅,然後準備,烘烤,切割和裝箱。

該設計將創建比薩餅的職責與名稱(這就是PizzaFactory所做的)分開,並將它們賣給客戶(這就是PizzaStore所做的)。

PizzaStore可以選擇使用另一個fozen比薩餅供應商,這將創造不同的比薩餅。但比薩店的準備,烘烤和拳擊仍然以同樣的方式工作。

-1

我還沒有讀過這本書。但是,這是什麼在頭部設計模式中可用作工廠方法設計模式(出現在四人幫的設計模式集合中)?或者他們在談論不同的設計模式?

如果這是爲了說明Factory Method設計模式用法的例子,這是一個錯誤的例子。

如果這是爲了說明抽象工廠設計模式使用情況的例子,那麼這又是一個錯誤的例子,但它更接近它(抽象工廠模式)。

那麼,你應該看看其他地方做出更好更有意義的例子。