溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java抽象工廠模式實例分析

發(fā)布時間:2022-02-17 09:17:48 來源:億速云 閱讀:156 作者:iii 欄目:開發(fā)技術

這篇文章主要介紹了Java抽象工廠模式實例分析的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Java抽象工廠模式實例分析文章都會有所收獲,下面我們一起來看看吧。

1.什么是抽象工廠模式?

  • 抽象工廠模式:  定義了一個interface用于創(chuàng)建相關或有依賴關系的對象簇,而無需指明具體的類。

  • 抽象工廠模式可以將簡單工廠模式和工廠方法模式進行整合。

  • 從設計層面看,抽象工廠模式就是對簡單工廠模式的改進(或者稱為進一步的抽象)。

  • 將工廠抽象成兩層,AbsFactory(抽象工廠))和具體實現(xiàn)的工廠子類。程序員可以根據(jù)創(chuàng)建對象類型使用對應的工廠子類。這樣將單個的簡單工廠類變成了工廠簇,更利于代碼的維護和擴展。

我們仍然以上一篇文章的案例為主,畫出抽象工廠模式下的類圖。

Java抽象工廠模式實例分析

2.案例代碼

首先仍然是Pizza種類相關的幾個類。

package com.szh.factory.abstractfactory.pizza;
 
/**
 * 聲明Pizza類為抽象類
 */
public abstract class Pizza {
    //Pizza名稱
    protected String name;
 
    //準備原材料,不同的披薩不一樣。因此,我們做成抽象方法,具體的原材料實現(xiàn)交給它的子類去完成
    public abstract void prepare();
 
    //烘烤
    public void bake() {
        System.out.println(name + " baking;");
    }
 
    //切割
    public void cut() {
        System.out.println(name + " cutting;");
    }
 
    //打包
    public void box() {
        System.out.println(name + " boxing;");
    }
 
    public void setName(String name) {
        this.name = name;
    }
}
package com.szh.factory.abstractfactory.pizza;
 
public class LDPepperPizza extends Pizza {
 
	@Override
	public void prepare() {
		setName("倫敦的胡椒pizza");
		System.out.println("倫敦的胡椒pizza 準備原材料");
	}
 
}
package com.szh.factory.abstractfactory.pizza;
 
public class LDCheesePizza extends Pizza {
 
	@Override
	public void prepare() {
		setName("倫敦的奶酪pizza");
		System.out.println("倫敦的奶酪pizza 準備原材料");
	}
 
}
package com.szh.factory.abstractfactory.pizza;
 
public class BJPepperPizza extends Pizza {
 
	@Override
	public void prepare() {
		setName("北京的胡椒pizza");
		System.out.println("北京的胡椒pizza 準備原材料");
	}
 
}
package com.szh.factory.abstractfactory.pizza;
 
public class BJCheesePizza extends Pizza {
 
	@Override
	public void prepare() {
		setName("北京的奶酪pizza");
		System.out.println("北京的奶酪pizza 準備原材料");
	}
 
}

下面是抽象工廠和工廠方法的區(qū)別之處。

package com.szh.factory.abstractfactory.order;
 
import com.szh.factory.abstractfactory.pizza.Pizza;
 
//一個抽象工廠模式的抽象層(接口)
public interface AbsFactory {
    //讓下面的工廠子類來具體實現(xiàn)
    public Pizza createPizza(String orderType);
}
package com.szh.abstractfactory.order;
 
import com.szh.abstractfactory.pizza.BJCheesePizza;
import com.szh.abstractfactory.pizza.BJPepperPizza;
import com.szh.abstractfactory.pizza.Pizza;
 
public class BJFactory implements AbsFactory {
    @Override
    public Pizza createPizza(String orderType) {
        Pizza pizza = null;
        if("cheese".equals(orderType)) {
            pizza = new BJCheesePizza();
        } else if ("pepper".equals(orderType)){
            pizza = new BJPepperPizza();
        }
        return pizza;
    }
}
package com.szh.abstractfactory.order;
 
import com.szh.abstractfactory.pizza.LDCheesePizza;
import com.szh.abstractfactory.pizza.LDPepperPizza;
import com.szh.abstractfactory.pizza.Pizza;
 
public class LDFactory implements AbsFactory {
    @Override
    public Pizza createPizza(String orderType) {
        Pizza pizza = null;
        if ("cheese".equals(orderType)) {
            pizza = new LDCheesePizza();
        } else if ("pepper".equals(orderType)) {
            pizza = new LDPepperPizza();
        }
        return pizza;
    }
}
package com.szh.factory.abstractfactory.order;
 
import com.szh.factory.abstractfactory.pizza.Pizza;
 
import java.util.Scanner;
 
public class OrderPizza {
 
    AbsFactory absFactory;
 
    public OrderPizza(AbsFactory absFactory) {
        setFactory(absFactory);
    }
 
    private void setFactory(AbsFactory absFactory) {
        Pizza pizza = null;
        String orderType = ""; // 用戶輸入
        this.absFactory = absFactory;
        do {
            orderType = getType();
            // factory 可能是北京的工廠子類,也可能是倫敦的工廠子類
            pizza = absFactory.createPizza(orderType);
            if (pizza != null) { // 訂購ok
                pizza.prepare();
                pizza.bake();
                pizza.cut();
                pizza.box();
            } else {
                System.out.println("訂購失敗");
                break;
            }
        } while (true);
    }
 
    // 寫一個方法,可以獲取客戶希望訂購的披薩種類
    private String getType() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("請輸入 pizza 種類: ");
        String str = scanner.nextLine();
        return str;
    }
}

最后是測試類。

package com.szh.abstractfactory;
 
import com.szh.abstractfactory.order.BJFactory;
import com.szh.abstractfactory.order.LDFactory;
import com.szh.abstractfactory.order.OrderPizza;
 
import java.util.Scanner;
 
public class MainTest {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String content = scanner.next();
        if ("Beijing".equals(content)) {
            new OrderPizza(new BJFactory());
        } else if ("London".equals(content)) {
            new OrderPizza(new LDFactory());
        } else {
            System.out.println("無法預先匹配Pizza種類....");
            scanner.close();
        }
    }
}

Java抽象工廠模式實例分析

關于“Java抽象工廠模式實例分析”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Java抽象工廠模式實例分析”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI