工厂方法模式

工厂方法模式(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值