工厂方法模式

来源:互联网 发布:买卖域名赚钱 编辑:程序博客网 时间:2024/06/05 11:16

工厂方法模式(Factory Method Pattern):通过让子类决定该创建的对象是什么,来达到将对象创建的过程封装的目的(将父类定义为抽象类,可以有抽象方法或者没有抽象方法)。工厂方法让类把实例化推迟到子类。

 

举个栗子:

有一家公司专门制作披萨,但是不同地方的披萨店制作的披萨是不一样的,比如:芝加哥点制作出芝加哥类型的披萨,纽约店会制作出纽约店的披萨。

思路分析:

制作披萨Pizza的流程是大致一样的,因此,可以写一个抽象类Pizza(这里我们给出的Pizza抽象类实际上没有抽象方法),芝加哥披萨和纽约披萨都要继承Pizza类。利用工厂方法模式,我们创建了类PizzaStore,我们在订购披萨的流程的过程中,创建了一个抽象方法创建披萨方法,这个方法需要由所有继承该PizzaStore实现,具体实现代码如下:

 

披萨饼相关的类:

Pizza.java 类如下:

/** *  匹萨 抽象类(虽然没有任何抽象方法) */public abstract class Pizza {    String name;    // 名称    String dough;   // 面团类型    String sauce;   // 酱料类型    ArrayList topping = 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 < topping.size(); i++) {            System.out.println(" " +  topping.get(i));        }    }    void bake() {        System.out.println("Bake for 25 minutes at 350");    }    void cut() {        System.out.println("Cutting the pizza ");    }    void box() {        System.out.println("Place pizza in official PizzaStore box");    }    public String getName() {        return name;    }}

芝加哥披萨类如下:

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";        topping.add("Shredded Mozzarella Cheese");    }    void cut() {        System.out.println("Cutting the pizza into square slices");    }}

纽约披萨如下:

NYStyleCheesePizza.java 类:

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

与实现工厂方法模式相关的类如下:

PizzaStore.java 类:

public abstract class PizzaStore {    public Pizza orderPizza(String type) {        Pizza pizza;        pizza = createPizza(type);        pizza.prepare();        pizza.bake();        pizza.cut();        pizza.box();        return pizza;    }    protected abstract Pizza createPizza(String type); // 特别注意这个}

芝加哥披萨店:

ChicagoPizzaStore.java 类:

public class ChicagoPizzaStore extends PizzaStore {    @Override    protected Pizza createPizza(String type) {        return new ChicagoStyleCheesePizza();    }}

纽约披萨店:

NYPizzaStore.java 类:

public class NYPizzaStore extends PizzaStore {    @Override    protected Pizza createPizza(String type) {        return new NYStyleCheesePizza();    }}

编写测试类如下:
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");    }}
输出如下:
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 
Place pizza in official PizzaStore box
Ethan ordered a NY Style Sauce and 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

原创粉丝点击