一、工廠方法模式介紹
工廠方法模式:定義了一個創建對象的抽象方法,由子類決定要實例化的類。工廠方法模式將對象的實例化推遲到子類。
二、應用
- 在簡單工廠模式的應用上,用工廠方法模式進一步修改:將披薩項目的實例化功能抽象成抽象方法,在不同的口味點餐子類中具體實現。
- 類圖
3. 代碼
1)抽象披薩類
public abstract class Pizza {
protected String name; //名字
//準備原材料,不同的披薩不一樣,因此,我們做成抽象方法
public abstract void prepare();
public void back(){
System.out.println(name + "backing");
}
public void cut(){
System.out.println(name + "cut");
}
public void box(){
System.out.println(name + "boxing");
}
public void setName(String name){
this.name = name;
}
}
2)具體披薩類,繼承抽象類披薩
public class LDPepperPizza extends Pizza{
public void prepare() {
setName("倫敦的胡椒pizza");
System.out.println("倫敦的胡椒pizza 準備原材料");
}
}
public class LDCheesePizza extends Pizza{
public void prepare() {
setName("倫敦的奶酪pizza");
System.out.println("倫敦的奶酪pizza 準備原材料");
}
}
public class BJPepperPizza extends Pizza{
public void prepare() {
setName("北京的胡椒pizza");
System.out.println("北京的胡椒pizza 準備原材料");
}
}
public class BJCheesePizza extends Pizza{
public void prepare() {
setName("北京的奶酪pizza");
System.out.println("北京的奶酪pizza 準備原材料");
}
}
3)抽象類訂單披薩
public abstract class OrderPizza {
//定義一個抽象方法,createPizza,讓各個工廠子類自己實現
abstract Pizza createPizza(String orderType);
//構造器
public OrderPizza(){
Pizza pizza = null;
String orderType;//訂購披薩的類型
do{
orderType = getType();
pizza = createPizza(orderType);
//輸出pizza製作過程
pizza.prepare();
pizza.back();
pizza.cut();
pizza.box();
}while(true);
}
//寫一個方法,可以獲取客戶希望訂購的披薩種類
private String getType(){
try{
BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
System.out.println("input pizza type:");
String str = strin.readLine();
return str;
}catch (IOException e){
e.printStackTrace();
return "";
}
}
}
4)具體類訂單披薩
public class LDOrderPizza extends OrderPizza{
Pizza createPizza(String orderType) {
Pizza pizza = null;
if(orderType.equals("cheese")){
pizza = new LDCheesePizza();
}else if(orderType.equals("pepper")){
pizza = new LDCheesePizza();
}
return pizza;
}
}
public class BJOrderPizza extends OrderPizza{
Pizza createPizza(String orderType) {
Pizza pizza = null;
if(orderType.equals("cheese")){
pizza = new BJCheesePizza();
}else if(orderType.equals("pepper")){
pizza = new BJPepperPizza();
}
return pizza;
}
}
5)店鋪類
public class PizzaStore {
public static void main(String[] args) {
new BJOrderPizza();
}
}