設計模式——工廠方法模式(Factory Method Pattern)

工廠方法模式定義了一個創建對象的接口,但由子類決定要實例化的類是哪一個。工廠方法讓類把實例化推遲到子類。


類圖

111915972.png

(圖片源於網絡)


代碼實現(Java)

產品類

// Pizza.java
public abstract class Pizza {
    String name;
    String dough;
    String sauce;
    ArrayList toppings = new ArrayList();
    void prepare() {
        System.out.println("Preparing " + name);
        System.out.println("Tossing dough...");
        System.out.println("Adding sauce...");
        System.out.println("Adding toppings: ");
        for (int i = 0; i < toppings.size(); i++) {
            System.out.println("   " + toppings.get(i));
        }
    }
                                                                             
    void bake() {
        System.out.println("Bake for 25 minutes at 350");
    }
                                                                            
    void cut() {
        System.out.println("Cutting the pizza into diagonal slices");
    }
                                                                             
    void box() {
        System.out.println("Place pizza in official PizzaStore box");
    }
                                                                            
    public String getName() {
        return name;
    }
    public String toString() {
        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();
    }
}


// NYStyleCheesePizza.java
public class NYStyleCheesePizza extends Pizza {
    public NYStyleCheesePizza() {
        name = "NY Style Sauce and Cheese Pizza";
        dough = "Thin Crust Dough";
        sauce = "Marinara Sauce";
        toppings.add("Grated Reggiano Cheese");
    }
}


// NYStylePepperoniPizza.java
public class NYStylePepperoniPizza extends Pizza {
    public NYStylePepperoniPizza() {
        name = "NY Style Pepperoni Pizza";
        dough = "Thin Crust Dough";
        sauce = "Marinara Sauce";
                                                                     
        toppings.add("Grated Reggiano Cheese");
        toppings.add("Sliced Pepperoni");
        toppings.add("Garlic");
        toppings.add("Onion");
        toppings.add("Mushrooms");
        toppings.add("Red Pepper");
    }
}


// NYStyleClamPizza.java
public class NYStyleClamPizza extends Pizza {
    public NYStyleClamPizza() {
        name = "NY Style Clam Pizza";
        dough = "Thin Crust Dough";
        sauce = "Marinara Sauce";
                                                             
        toppings.add("Grated Reggiano Cheese");
        toppings.add("Fresh Clams from Long Island Sound");
    }
}


// NYStyleVeggiePizza.java
public class NYStyleVeggiePizza extends Pizza {
    public NYStyleVeggiePizza() {
        name = "NY Style Veggie Pizza";
        dough = "Thin Crust Dough";
        sauce = "Marinara Sauce";
                                                         
        toppings.add("Grated Reggiano Cheese");
        toppings.add("Garlic");
        toppings.add("Onion");
        toppings.add("Mushrooms");
        toppings.add("Red Pepper");
    }
}


// ChicagoStyleCheesePizza.java
public class ChicagoStyleCheesePizza extends Pizza {
    public ChicagoStyleCheesePizza() {
        name = "Chicago Style Deep Dish Cheese Pizza";
        dough = "Extra Thick Crust Dough";
        sauce = "Plum Tomato Sauce";
        toppings.add("Shredded Mozzarella Cheese");
    }
    void cut() {
        System.out.println("Cutting the pizza into square slices");
    }
}


// ChicagoStylePepperoniPizza.java
public class ChicagoStylePepperoniPizza extends Pizza {
    public ChicagoStylePepperoniPizza() {
        name = "Chicago Style Pepperoni Pizza";
        dough = "Extra Thick Crust Dough";
        sauce = "Plum Tomato Sauce";
        toppings.add("Shredded Mozzarella Cheese");
        toppings.add("Black Olives");
        toppings.add("Spinach");
        toppings.add("Eggplant");
        toppings.add("Sliced Pepperoni");
    }
    void cut() {
        System.out.println("Cutting the pizza into square slices");
    }
}


// ChicagoStyleClamPizza.java
public class ChicagoStyleClamPizza extends Pizza {
    public ChicagoStyleClamPizza() {
        name = "Chicago Style Clam Pizza";
        dough = "Extra Thick Crust Dough";
        sauce = "Plum Tomato Sauce";
        toppings.add("Shredded Mozzarella Cheese");
        toppings.add("Frozen Clams from Chesapeake Bay");
    }
    void cut() {
        System.out.println("Cutting the pizza into square slices");
    }
}


// ChicagoStyleVeggiePizza.java
public class ChicagoStyleVeggiePizza extends Pizza {
    public ChicagoStyleVeggiePizza() {
        name = "Chicago Deep Dish Veggie Pizza";
        dough = "Extra Thick Crust Dough";
        sauce = "Plum Tomato Sauce";
        toppings.add("Shredded Mozzarella Cheese");
        toppings.add("Black Olives");
        toppings.add("Spinach");
        toppings.add("Eggplant");
    }
    void cut() {
        System.out.println("Cutting the pizza into square slices");
    }
}


創造者類

// PizzaStore.java
public abstract class PizzaStore {
                          
    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;
    }
}


// NYPizzaStore.java
public class NYPizzaStore extends PizzaStore {
    Pizza createPizza(String item) {
        if (item.equals("cheese")) {
            return new NYStyleCheesePizza();
        } else if (item.equals("veggie")) {
            return new NYStyleVeggiePizza();
        } else if (item.equals("clam")) {
            return new NYStyleClamPizza();
        } else if (item.equals("pepperoni")) {
            return new NYStylePepperoniPizza();
        } else return null;
    }
}


// ChicagoPizzaStore.java
public class ChicagoPizzaStore extends PizzaStore {
    Pizza createPizza(String item) {
            if (item.equals("cheese")) {
                    return new ChicagoStyleCheesePizza();
            } else if (item.equals("veggie")) {
                    return new ChicagoStyleVeggiePizza();
            } else if (item.equals("clam")) {
                    return new ChicagoStyleClamPizza();
            } else if (item.equals("pepperoni")) {
                    return new ChicagoStylePepperoniPizza();
            } else return null;
    }
}


測試代碼

// PizzaTestDrive.java
public class PizzaTestDrive {
               
    public static void main(String[] args) {
        PizzaStore nyStore = new NYPizzaStore();
        PizzaStore chicagoStore = new ChicagoPizzaStore();
               
        Pizza pizza = nyStore.orderPizza("cheese");
        System.out.println("Ethan ordered a " + pizza.getName() + "\n");
               
        pizza = chicagoStore.orderPizza("cheese");
        System.out.println("Joel ordered a " + pizza.getName() + "\n");
        pizza = nyStore.orderPizza("clam");
        System.out.println("Ethan ordered a " + pizza.getName() + "\n");
               
        pizza = chicagoStore.orderPizza("clam");
        System.out.println("Joel ordered a " + pizza.getName() + "\n");
        pizza = nyStore.orderPizza("pepperoni");
        System.out.println("Ethan ordered a " + pizza.getName() + "\n");
               
        pizza = chicagoStore.orderPizza("pepperoni");
        System.out.println("Joel ordered a " + pizza.getName() + "\n");
        pizza = nyStore.orderPizza("veggie");
        System.out.println("Ethan ordered a " + pizza.getName() + "\n");
               
        pizza = chicagoStore.orderPizza("veggie");
        System.out.println("Joel ordered a " + pizza.getName() + "\n");
    }
}


運行效果

--- Making a NY Style Sauce and Cheese Pizza ---

Preparing NY Style Sauce and Cheese Pizza

Tossing dough...

Adding sauce...

Adding toppings:

Grated Reggiano Cheese

Bake for 25 minutes at 350

Cutting the pizza into diagonal slices

Place pizza in official PizzaStore box

Ethan ordered a NY Style Sauce and Cheese Pizza


--- Making a Chicago Style Deep Dish Cheese Pizza ---

Preparing Chicago Style Deep Dish Cheese Pizza

Tossing dough...

Adding sauce...

Adding toppings:

Shredded Mozzarella Cheese

Bake for 25 minutes at 350

Cutting the pizza into square slices

Place pizza in official PizzaStore box

Joel ordered a Chicago Style Deep Dish Cheese Pizza


--- Making a NY Style Clam Pizza ---

Preparing NY Style Clam Pizza

Tossing dough...

Adding sauce...

Adding toppings:

Grated Reggiano Cheese

Fresh Clams from Long Island Sound

Bake for 25 minutes at 350

Cutting the pizza into diagonal slices

Place pizza in official PizzaStore box

Ethan ordered a NY Style Clam Pizza


--- Making a Chicago Style Clam Pizza ---

Preparing Chicago Style Clam Pizza

Tossing dough...

Adding sauce...

Adding toppings:

Shredded Mozzarella Cheese

Frozen Clams from Chesapeake Bay

Bake for 25 minutes at 350

Cutting the pizza into square slices

Place pizza in official PizzaStore box

Joel ordered a Chicago Style Clam Pizza


--- Making a NY Style Pepperoni Pizza ---

Preparing NY Style Pepperoni Pizza

Tossing dough...

Adding sauce...

Adding toppings:

Grated Reggiano Cheese

Sliced Pepperoni

Garlic

Onion

Mushrooms

Red Pepper

Bake for 25 minutes at 350

Cutting the pizza into diagonal slices

Place pizza in official PizzaStore box

Ethan ordered a NY Style Pepperoni Pizza


--- Making a Chicago Style Pepperoni Pizza ---

Preparing Chicago Style Pepperoni Pizza

Tossing dough...

Adding sauce...

Adding toppings:

Shredded Mozzarella Cheese

Black Olives

Spinach

Eggplant

Sliced Pepperoni

Bake for 25 minutes at 350

Cutting the pizza into square slices

Place pizza in official PizzaStore box

Joel ordered a Chicago Style Pepperoni Pizza


--- Making a NY Style Veggie Pizza ---

Preparing NY Style Veggie Pizza

Tossing dough...

Adding sauce...

Adding toppings:

Grated Reggiano Cheese

Garlic

Onion

Mushrooms

Red Pepper

Bake for 25 minutes at 350

Cutting the pizza into diagonal slices

Place pizza in official PizzaStore box

Ethan ordered a NY Style Veggie Pizza


--- Making a Chicago Deep Dish Veggie Pizza ---

Preparing Chicago Deep Dish Veggie Pizza

Tossing dough...

Adding sauce...

Adding toppings:

Shredded Mozzarella Cheese

Black Olives

Spinach

Eggplant

Bake for 25 minutes at 350

Cutting the pizza into square slices

Place pizza in official PizzaStore box

Joel ordered a Chicago Deep Dish Veggie Pizza


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章