設計模式(四)——工廠方法模式

一、工廠方法模式介紹

      工廠方法模式:定義了一個創建對象的抽象方法,由子類決定要實例化的類。工廠方法模式將對象的實例化推遲到子類。

二、應用

  1. 在簡單工廠模式的應用上,用工廠方法模式進一步修改:將披薩項目的實例化功能抽象成抽象方法,在不同的口味點餐子類中具體實現。
  2. 類圖

在這裏插入圖片描述
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();
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章