定义
结构
例子
现在有一个披萨店对象,有三种披萨对象:PizzaA PizzaB PizzaC,都是Pizza 的子类. 披萨店有点餐方法.
public class Pizza {
void prepare(){
System.out.println("preparing...");
}
void bake(){
System.out.println("baking...");
}
void cut(){
System.out.println("cutting...");
}
void box(){
System.out.println("boxing...");
}
}
public class PizzaA extends Pizza {
String name="A";
}
public class PizzaB extends Pizza{
String name="B";
}
public class PizzaC extends Pizza{
String name="C";
}
public class PizzaStore {
public static void main(String[] args) {
PizzaStore store = new PizzaStore();
Pizza pizza = store.orderPizza("A");
}
//点一个Pizza
public Pizza orderPizza(String type){
Pizza pizza = null;
if(type.equals("A"))
pizza = new PizzaA();
else if(type.equals("B"))
pizza = new PizzaB();
else if(type.equals("C"))
pizza = new PizzaC();
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return null;
}
}
Pizza类和PizzaStore现在是紧耦合,试着将 new对象语句抽出到一个方法里,就是简单工厂方法.
package FactoryMethod;
public class PizzaStore {
public static void main(String[] args) {
PizzaStore store = new PizzaStore();
Pizza pizza = store.orderPizza("A");
}
public Pizza simpleFactory(String type){
Pizza pizza = null;
if(type.equals("A"))
pizza = new PizzaA();
else if(type.equals("B"))
pizza = new PizzaB();
else if(type.equals("C"))
pizza = new PizzaC();
return pizza;
}
//点一个Pizza
public Pizza orderPizza(String type){
Pizza pizza =simpleFactory(type);
System.out.println(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return null;
}
}
但方法现在仍然在这个类中,还是存在耦合,创建接口,实现工厂方法.
new 对象产生的耦合被消除了.
public class PizzaFactory extends FactoryMethod {
Object factoryMethod(String type) {
Pizza pizza = null;
if (type.equals("A"))
pizza = new PizzaA();
else if (type.equals("B"))
pizza = new PizzaB();
else if (type.equals("C"))
pizza = new PizzaC();
return pizza;
}
}
public class PizzaStore {
FactoryMethod factory;
public static void main(String[] args) {
PizzaStore store = new PizzaStore();
Pizza pizza = store.orderPizza("A");
}
public PizzaStore(FactoryMethod factory){
this.factory=factory;
}
//点一个Pizza
public Pizza orderPizza(String type){
Pizza pizza =(Pizza)factory.factoryMethod(type);
System.out.println(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return null;
}
}