1、问题引入
new的作用是实例化对象,如
Pizza pizza = new CheesePizza();
但整个实例化的过程会和代码绑定的比较深。如果有若干个派生类,实例化的过程你通常需要这样写:
Pizza pizza;
if("Cheese".equals(type)) {
pizza = new CheesPizza();
} else if("Pepperoni".equals(type)) {
pizza = new PepperoniPizza();
} else if ("Clam".equals(type)) {
pizza = new ClamPizza();
} else if ("Veggie".equals(type)) {
pizza = new VeggiePizza();
}
这时究竟需要实例化哪个具体类,要在运行时由一些条件来决定。可是一旦子类有变化或者扩展,就必须重新打开这段代码进行检查和修改。这通常会造成系统难以更新和维护,还会导致严重的错误。
2、问题的解决
我们这时候通常会将实例化对象的代码封装在另一一个类SimplePizzaFactory中,这个类我们称之为工厂(factory)。
class SimplePizzaFactory{
public static Pizza createPizza(String type)
{
if("Cheese".equals(type)) {
pizza = new CheesPizza();
} else if("Pepperoni".equals(type)) {
pizza = new PepperoniPizza();
} else if ("Clam".equals(type)) {
pizza = new ClamPizza();
} else if ("Veggie".equals(type)) {
pizza = new VeggiePizza();
}
}
}
当需要创建实例化的对象时,可以直接通过SimplePizzaFactory类调用静态的方法createPizza(String type)来完成。
public class orderPizza{
public static void main(String args[]){
Pizza pizza = SimplePizzaFactory.createPizza("Clam");
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}
}