定义:定义一个用于创建对象的接口,让子类决定初始化哪一个具体的类。工厂方法把具体类的实例化推迟到子类。
使用场景: 1)当类的某个属性需要不同的实例化对象时;2)当不知道类的某个属性会有多少不同的实例化对象时
类图:
代码样例:
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;
}
}
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;
}
}
优点:1)当需要不同的具体Product实现时,不会对Creator造成影响;
缺点:
类似的设计模式:
见模板方法设计模式
配套的内功心法:1)依赖反转原则,依赖抽象类,而不是具体的实现。这个原则和面向接口编程的原则很相似,但是依赖反转原则强调的是高层次类应该摆脱对低层次类的依赖。比如A调用了B,A就是高层次类,看上去就是A依赖于B,但是如果A中定义的是B的接口或者抽象类,就能摆脱对B的依赖了。