工厂方法模式:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
工厂方法模式:每个抽象工厂派生多个具体工厂,每个抽象产品派生多个具体产品。每个具体工厂创建一个具体产品。
这里由子类决定,不是运行时决定,而是创建类时,不需要知道实际创建产品是哪一个。选择了使用哪个子类,自然就决定了实际创建的产品是什么。
工厂方法例子:
public abstract class PizzaStore {
public Pizza orderPizza(String type){
Pizza pizza;
pizza= createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
abstract Pizza createPizza(String type);
}
public class NYPizzaStore extends PizzaStore{
@Override
Pizza createPizza(String item) {
// TODO Auto-generated method stub
if(item.equals("cheese"))
{
return new NYStyleCheesePizza();
}
else
return null;
}
}
public abstract class Pizza {
String name;
String dough;
String sauce;
ArrayList<String> toppings = new ArrayList<String>();
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 (String topping : toppings) {
display.append(topping + "\n");
}
return display.toString();
}
}
public class NYPizzaStore extends PizzaStore{
@Override
Pizza createPizza(String item) {
// TODO Auto-generated method stub
if(item.equals("cheese"))
{
return new NYStyleCheesePizza();
}
else
return null;
}
}