1.介紹
它是定義一個創建對象的接口,但由子類決定要實例化的類是哪一個,工廠方法讓類把實例化推遲到子類中。
2.小栗子
Pizza店做Pizza
3.代碼實現
// Pizza抽象類
public abstract class Pizza {
protected PizzaIngredientFactory factory = null;
public Pizza(PizzaIngredientFactory factory) {
this.factory = factory;
}
public abstract String getName();
public void prepare() {
System.out.println("Dough:" + factory.createDough().getName());
System.out.println("Sauce:" + factory.createSauce().getName());
System.out.println(this.getName() + " prepare success.");
}
}
// 紐約Pizza
public class NYPizza extends Pizza {
public NYPizza(PizzaIngredientFactory factory) {
super(factory);
}
@Override
public String getName() {
return "NY Pizza";
}
}
// 西雅圖Pizza
public class SeattlePizza extends Pizza {
public SeattlePizza(PizzaIngredientFactory factory) {
super(factory);
}
@Override
public String getName() {
return "Seattle Pizza";
}
}
// Pizza店 做Pizza
public abstract class PizzaStore {
public void orderPizza(PizzaIngredientFactory factory) {
Pizza pizza = createPizza(factory);
pizza.prepare();
}
// 工廠方法模式
protected abstract Pizza createPizza(PizzaIngredientFactory factory);
}
// 紐約PizzaStore
public class NYPizzaStore extends PizzaStore {
@Override
protected Pizza createPizza(PizzaIngredientFactory factory) {
return new NYPizza(factory);
}
}
4.測試
public class FactoryMethodPatternDemo {
public static void main(String[] args) {
PizzaIngredientFactory nyFactory = new NYPizzaIngredientFactory();
PizzaIngredientFactory seattleFactory = new SeattlePizzaIngredientFactory();
PizzaStore pizzaStore = new NYPizzaStore();
pizzaStore.orderPizza(seattleFactory);
pizzaStore.orderPizza(nyFactory);
}
}
5.總結
紐約可以做紐約/西雅圖等地區風格的Pizza,而且Pizza本身風格也是可以擴展的。
源碼地址:https://gitee.com/jsjack_wang/JavaDemo