設計模式(五)——抽象工廠模式

一、抽象工廠模式基本介紹

1)抽象工廠模式:定義了一個interface用於創建相關或有依賴關係的對象簇,而無需指明具體的類;
2)抽象工廠模式可以將簡單工廠模式和工廠方法模式進行整合;
3)從設計層面看,抽象工廠模式就是對簡單工廠模式的改進(或者稱爲進一步的抽象);
4)將工廠抽象爲兩層,AbsFactory(抽象工廠)和具體實現的工廠子類。程序員可以根據創建對象類型使用對應的工廠子類。這樣將單個的簡單工廠類變成了工廠簇,更利於代碼的維護和擴展。

二、應用

  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 class OrderPizza {

    AbsFactory factory;

    //構造器
    public OrderPizza(AbsFactory factory){
        setFactory(factory);
    }

    private void setFactory(AbsFactory factory){
        Pizza pizza = null;
        String orderType = "";//用戶輸入
        this.factory = factory;
        do{
            orderType = getType();
            //factory 可能是北京的工廠子類,也可能是倫敦的工廠子類
            pizza = factory.createPizza(orderType);
            if(pizza != null){
                pizza.prepare();
                pizza.back();
                pizza.cut();
                pizza.box();
            }else{
                System.out.println("訂購失敗");
                break;
            }
        }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 interface AbsFactory {
    //讓下面的工廠子類來具體實現
    public Pizza createPizza(String orderType);
}

5)具體工廠子類

//這是工廠子類
public class BJFactory implements AbsFactory{

    public Pizza createPizza(String orderType) {
        System.out.println("使用的是抽象工廠模式~");
        Pizza pizza = null;
        if(orderType.equals("cheese")){
            pizza = new BJCheesePizza();
        }else if(orderType.equals("pepper")){
            pizza = new BJPepperPizza();
        }
        return pizza;
    }
}
public class LDFactory implements AbsFactory{

    public Pizza createPizza(String orderType) {
        System.out.println("使用的是抽象工廠模式~");
        Pizza pizza = null;
        if(orderType.equals("cheese")){
            pizza = new LDCheesePizza();
        }else if(orderType.equals("pepper")){
            pizza = new LDPepperPizza();
        }
        return pizza;
    }
}

6)披薩店類

public class PizzaStore {

    public static void main(String[] args) {
        new OrderPizza(new BJFactory());
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章